欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android系列---JSON數(shù)據(jù)解析的實例

 更新時間:2016年11月17日 11:26:28   作者:xiaoluo501395377  
JSON(JavaScript Object Notation)和XML,并稱為客戶端和服務(wù)端交互解決方案的倚天劍和屠龍刀,這篇文章主要介紹了Android系列---JSON數(shù)據(jù)解析的實例,有興趣的可以了解一下。

上篇隨筆詳細(xì)介紹了三種解析服務(wù)器端傳過來的xml數(shù)據(jù)格式,而對于服務(wù)器端來說,返回給客戶端的數(shù)據(jù)格式一般分為html、xml和json這三種格式,那么本篇隨筆將講解一下json這個知識點(diǎn),包括如何通過json-lib和gson這兩個json解析庫來對解析我們的json數(shù)據(jù),以及如何在我們的Android客戶端解析來自服務(wù)器端的json數(shù)據(jù),并更新到UI當(dāng)中。

一、什么是json

json(Javascript Object Notation)是一種輕量級的數(shù)據(jù)交換格式,相比于xml這種數(shù)據(jù)交換格式來說,因為解析xml比較的復(fù)雜,而且需要編寫大段的代碼,所以客戶端和服務(wù)器的數(shù)據(jù)交換格式往往通過json來進(jìn)行交換。尤其是對于web開發(fā)來說,json數(shù)據(jù)格式在客戶端直接可以通過javascript來進(jìn)行解析。

json一共有兩種數(shù)據(jù)結(jié)構(gòu),一種是以 (key/value)對形式存在的無序的jsonObject對象,一個對象以“{”(左花括號)開始,“}”(右花括號)結(jié)束。每個“名稱”后跟一個“:”(冒號);“‘名稱/值' 對”之間使用“,”(逗號)分隔。

例如:{"name": "xiaoluo"}, 這就是一個最簡單的json對象,對于這種數(shù)據(jù)格式,key值必須要是string類型,而對于value,則可以是string、number、object、array等數(shù)據(jù)類型:

另一種數(shù)據(jù)格式就是有序的value的集合,這種形式被稱為是jsonArray,數(shù)組是值(value)的有序集合。一個數(shù)組以“[”(左中括號)開始,“]”(右中括號)結(jié)束。值之間使用“,”(逗號)分隔。
更多的有關(guān)json數(shù)據(jù)格式可以參加json的官網(wǎng),http://www.json.org/json-zh.html

二、解析json數(shù)據(jù)格式

這里將使用兩種json的解析庫來對我們的json數(shù)據(jù)格式進(jìn)行解析以及生成我們的json數(shù)據(jù)格式。

1.json-lib(http://json-lib.sourceforge.net/)

使用json-lib來進(jìn)行解析,我們需要引入第三方的包,因為json-lib分為了兩個版本,一個版本是針對于jdk1.3的,一個版本是針對于jdk1.5的,這里我們下載jdk1.5的這個json-lib包,其中還需要引入其他的幾個jar包:
下載好這幾個jar包后,加入到classpath中即可。我們來看看json-lib給我們提供的API。

我們最常用的兩個類就是  JSONObject和JSONArray這兩個類,分別代表了json對象和json數(shù)組,這兩個類都實現(xiàn)了 JSON 這個接口,下面我們通過幾個小例子來看看如何將我們常見的幾種數(shù)據(jù)格式轉(zhuǎn)換成我們的json對象(我們一般稱之為JSON數(shù)據(jù)的序列化)以及再將json對象在轉(zhuǎn)換成我們的數(shù)據(jù)格式(稱之為反序列化)。

①簡單的javabean的序列化和反序列化

public class Person
{
  private int id;
  private String name;
  private String address;

  public Person()
  {
  }

  public int getId()
  {
    return id;
  }

  public void setId(int id)
  {
    this.id = id;
  }

  public String getName()
  {
    return name;
  }

  public void setName(String name)
  {
    this.name = name;
  }

  public String getAddress()
  {
    return address;
  }

  public void setAddress(String address)
  {
    this.address = address;
  }

  public Person(int id, String name, String address)
  {
    super();
    this.id = id;
    this.name = name;
    this.address = address;
  }

  @Override
  public String toString()
  {
    return "Person [id=" + id + ", name=" + name + ", address=" + address
        + "]";
  }

}

首先我們定義一個簡單的javabean對象,然后將一個Person對象轉(zhuǎn)換成json對象,然后再將這個json對象反序列化成我們的Person對象。

我們先定義一個JsonTools類,這個類有兩個靜態(tài)方法,我們可以通過這兩個方法來得到一個JSON類型的字符串對象,以及一個JSON對象

public class JsonTools
{
  /**
   * 得到一個json類型的字符串對象
   * @param key
   * @param value
   * @return
   */
  public static String getJsonString(String key, Object value)
  {
    JSONObject jsonObject = new JSONObject();
    //put和element都是往JSONObject對象中放入 key/value 對
//    jsonObject.put(key, value);
    jsonObject.element(key, value);
    return jsonObject.toString();
  }
  
  /**
   * 得到一個json對象
   * @param key
   * @param value
   * @return
   */
  public static JSONObject getJsonObject(String key, Object value)
  {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put(key, value);
    return jsonObject;
  }
  
}

我們可以直接通過 JSONObject jsonObject = new JSONObject(); 這個方法就可以得到一個json對象,然后通過element()或者是put()方法來給我們的json對象添加key/value對。我們先來看看第一個例子,實現(xiàn)一個簡單的Person對象和json對象的轉(zhuǎn)換  

  Person person = new Person(1, "xiaoluo", "廣州");
    //  將Person對象轉(zhuǎn)換成一個json類型的字符串對象
    String personString = JsonTools.getJsonString("person", person);
    System.out.println(personString.toString());

我們看看控制臺的輸出:

{"person":{"address":"廣州","id":1,"name":"xiaoluo"}}

整個外面的大括號是一個json對象,里面有一對key/value,其中里面的{"address":"廣州","id":1,"name":"xiaoluo"}就是我們轉(zhuǎn)換成的json字符串對象

再來看看如何將json對象轉(zhuǎn)換成我們的bean對象

     JSONObject jsonObject = JsonTools.getJsonObject("person", person);
    //  通過JSONObject的toBean方法可以將json對象轉(zhuǎn)換成一個javabean
    JSONObject personObject = jsonObject.getJSONObject("person");
    Person person2 = (Person) JSONObject.toBean(personObject, Person.class);
    System.out.println(person2);
Person [id=1, name=xiaoluo, address=廣州]

②轉(zhuǎn)換List<Person>類型的對象

@Test
  public void testPersonsJson()
  {
    List<Person> persons = new ArrayList<Person>();
    Person person = new Person(1, "xiaoluo", "廣州");
    Person person2 = new Person(2, "android", "上海");
    persons.add(person);
    persons.add(person2);
    String personsString = JsonTools.getJsonString("persons", persons);
    System.out.println(personsString);
    
    JSONObject jsonObject = JsonTools.getJsonObject("persons", persons);
    //  List<Person>相當(dāng)于一個JSONArray對象
    JSONArray personsArray = (JSONArray)jsonObject.getJSONArray("persons");
    List<Person> persons2 = (List<Person>) personsArray.toCollection(personsArray, Person.class);
    System.out.println(persons2);
  }
{"persons":[{"address":"廣州","id":1,"name":"xiaoluo"},{"address":"上海","id":2,"name":"android"}]}
[Person [id=1, name=xiaoluo, address=廣州], Person [id=2, name=android, address=上海]]

③List<Map<String, String>>類型的json對象轉(zhuǎn)換

@Test
  public void testMapJson()
  {
    List<Map<String, String>> list = new ArrayList<Map<String, String>>();
    Map<String, String> map1 = new HashMap<String, String>();
    map1.put("id", "001");
    map1.put("name", "xiaoluo");
    map1.put("age", "20");
    Map<String, String> map2 = new HashMap<String, String>();
    map2.put("id", "002");
    map2.put("name", "android");
    map2.put("age", "33");
    list.add(map1);
    list.add(map2);
    String listString = JsonTools.getJsonString("list", list);
    System.out.println(listString);
    
    JSONObject jsonObject = JsonTools.getJsonObject("list", list);
    JSONArray listArray = jsonObject.getJSONArray("list");
    List<Map<String, String>> list2 = (List<Map<String, String>>) listArray.toCollection(listArray, Map.class);
    System.out.println(list2);
  }
{"list":[{"id":"001","age":"20","name":"xiaoluo"},{"id":"002","age":"33","name":"android"}]}
[{id=001, name=xiaoluo, age=20}, {id=002, name=android, age=33}]

通過上面的例子,我們可以了解了如何通過json-lib這個解析庫來實現(xiàn)javabean、List、Map等數(shù)據(jù)和json數(shù)據(jù)的互相轉(zhuǎn)換

2.gson(http://code.google.com/p/google-gson/)

下面我們來看看Google提供的gson這個json解析庫,同樣我們需要去下載gson這個jar包,導(dǎo)入到我們的項目中

使用gson,我們可以非常輕松的實現(xiàn)數(shù)據(jù)對象和json對象的相互轉(zhuǎn)化,其中我們最常用的就是兩個方法,一個是fromJSON(),將json對象轉(zhuǎn)換成我們需要的數(shù)據(jù)對象,另一個是toJSON(),這個就是將我們的數(shù)據(jù)對象轉(zhuǎn)換成json對象。下面我們也通過一個綜合的例子來看看gson的使用方法:

public class JsonService
{
  public Person getPerson()
  {
    Person person = new Person(1, "xiaoluo", "廣州");
    return person;
  }
  
  public List<Person> getPersons()
  {
    List<Person> persons = new ArrayList<Person>();
    Person person = new Person(1, "xiaoluo", "廣州");
    Person person2 = new Person(2, "android", "上海");
    persons.add(person);
    persons.add(person2);
    return persons;
  }
  
  public List<String> getString()
  {
    List<String> list = new ArrayList<String>();
    list.add("廣州");
    list.add("上海");
    list.add("北京");
    return list;
  }
  
  public List<Map<String, String>> getMapList()
  {
    List<Map<String, String>> list = new ArrayList<Map<String, String>>();
    Map<String, String> map1 = new HashMap<String, String>();
    map1.put("id", "001");
    map1.put("name", "xiaoluo");
    map1.put("age", "20");
    Map<String, String> map2 = new HashMap<String, String>();
    map2.put("id", "002");
    map2.put("name", "android");
    map2.put("age", "33");
    list.add(map1);
    list.add(map2);
    return list;
  }
}
public static void main(String[] args)
  {
    Gson gson = new Gson();
    JsonService jsonService = new JsonService();
    Person person = jsonService.getPerson();
    System.out.println("person: " + gson.toJson(person));
    //  對于Object類型,使用 fromJson(String, Class)方法來將Json對象轉(zhuǎn)換成Java對象
    Person person2 = gson.fromJson(gson.toJson(person), Person.class);
    System.out.println(person2);
    System.out.println("------------------------------------------------");
    
    List<Person> persons = jsonService.getPersons();
    System.out.println("persons: " + gson.toJson(persons));
    /*
     * 對于泛型對象,使用fromJson(String, Type)方法來將Json對象轉(zhuǎn)換成對應(yīng)的泛型對象
     * new TypeToken<>(){}.getType()方法
     */
    List<Person> persons2 = gson.fromJson(gson.toJson(persons), new TypeToken<List<Person>>(){}.getType());
    System.out.println(persons2);
    System.out.println("------------------------------------------------");
    
    List<String> list = jsonService.getString();
    System.out.println("String---->" + gson.toJson(list));
    List<String> list2 = gson.fromJson(gson.toJson(list), new TypeToken<List<String>>(){}.getType());
    System.out.println("list2---->" + list2);
    System.out.println("------------------------------------------------");
    
    List<Map<String, String>> listMap = jsonService.getMapList();
    System.out.println("Map---->" + gson.toJson(listMap));
    List<Map<String, String>> listMap2 = gson.fromJson(gson.toJson(listMap), new TypeToken<List<Map<String, String>>>(){}.getType());
    System.out.println("listMap2---->" + listMap2);
    System.out.println("------------------------------------------------");
  }

看看控制臺的輸出:

person: {"id":1,"name":"xiaoluo","address":"廣州"}
Person [id=1, name=xiaoluo, address=廣州]
------------------------------------------------
persons: [{"id":1,"name":"xiaoluo","address":"廣州"},{"id":2,"name":"android","address":"上海"}]
[Person [id=1, name=xiaoluo, address=廣州], Person [id=2, name=android, address=上海]]
------------------------------------------------
String---->["廣州","上海","北京"]
list2---->[廣州, 上海, 北京]
------------------------------------------------
Map---->[{"id":"001","age":"20","name":"xiaoluo"},{"id":"002","age":"33","name":"android"}]
listMap2---->[{id=001, age=20, name=xiaoluo}, {id=002, age=33, name=android}]
------------------------------------------------

三、在Android客戶端解析服務(wù)器端的json數(shù)據(jù)

下面我們來完成一個綜合的例子,Android客戶端通過一個AsyncTask異步任務(wù)請求服務(wù)器端的某些數(shù)據(jù),然后在解析完這些數(shù)據(jù)后,將得到的數(shù)據(jù)內(nèi)容更新到我們的Spinner這個UI控件當(dāng)中。

我們首先來看下服務(wù)器端的代碼:

@WebServlet("/CityServlet")
public class CityServlet extends HttpServlet
{
  private static final long serialVersionUID = 1L;

  public CityServlet()
  {
    super();
  }

  protected void doGet(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException
  {
    this.doPost(request, response);
  }

  protected void doPost(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException
  {
    response.setContentType("text/html;charset=utf-8");
    request.setCharacterEncoding("utf-8");
    response.setCharacterEncoding("utf-8");
    PrintWriter writer = response.getWriter();
    
    String type = request.getParameter("type");
    if("json".equals(type))
    {
      List<String> cities = new ArrayList<String>();
      cities.add("廣州");
      cities.add("上海");
      cities.add("北京");
      cities.add("湖南");
      Map<String, List<String>> map = new HashMap<String, List<String>>();
      map.put("cities", cities);
      String citiesString = JSON.toJSONString(map);
      writer.println(citiesString);
    }
    
    writer.flush();
    writer.close();
  }

}

如果客戶端請求的參數(shù)是type=json,則響應(yīng)給客戶端一個json數(shù)據(jù)格式

接著來看看客戶端的代碼,首先看看客戶端的布局文件,其實就是一個按鈕和一個Spinner控件,當(dāng)點(diǎn)擊按鈕后,通過http協(xié)議請求服務(wù)器端的數(shù)據(jù),然后在接收到后再更新我們的Spinner控件的數(shù)據(jù)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >

  <TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="64dp"
    android:layout_marginTop="64dp"
    android:textSize="20sp"
    android:text="城市" />
  
  <Spinner 
    android:id="@+id/spinner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@id/textView1"
    android:layout_toRightOf="@id/textView1"/>

  <Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/textView1"
    android:layout_below="@+id/spinner"
    android:layout_marginLeft="22dp"
    android:layout_marginTop="130dp"
    android:text="加載數(shù)據(jù)" />

</RelativeLayout>

在Android客戶端寫一個解析json數(shù)據(jù)格式的類:

public class JsonUtils
{
  /**
   * @param citiesString  從服務(wù)器端得到的JSON字符串?dāng)?shù)據(jù)
   * @return  解析JSON字符串?dāng)?shù)據(jù),放入List當(dāng)中
   */
  public static List<String> parseCities(String citiesString)
  {
    List<String> cities = new ArrayList<String>();
    
    try
    {
      JSONObject jsonObject = new JSONObject(citiesString);
      JSONArray jsonArray = jsonObject.getJSONArray("cities");
      for(int i = 0; i < jsonArray.length(); i++)
      {
        cities.add(jsonArray.getString(i));
      }
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    
    return cities;
  }
}

當(dāng)然我們的HttpUtils類也不可少:

public class HttpUtils
{
  /**
   * @param path  請求的服務(wù)器URL地址
   * @param encode  編碼格式
   * @return  將服務(wù)器端返回的數(shù)據(jù)轉(zhuǎn)換成String
   */
  public static String sendPostMessage(String path, String encode)
  {
    String result = "";
    HttpClient httpClient = new DefaultHttpClient();
    try
    {
      HttpPost httpPost = new HttpPost(path);
      HttpResponse httpResponse = httpClient.execute(httpPost);
      if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
      {
        HttpEntity httpEntity = httpResponse.getEntity();
        if(httpEntity != null)
        {
          result = EntityUtils.toString(httpEntity, encode);
        }
      }
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    finally
    {
      httpClient.getConnectionManager().shutdown();
    }
    
    return result;
  }

最后來看看我們的MainActivity類:

public class MainActivity extends Activity
{
  private Spinner spinner;
  private Button button;
  private ArrayAdapter<String> adapter;
  private ProgressDialog dialog;
  private final String CITY_PATH_JSON = "http://172.25.152.34:8080/httptest/CityServlet?type=json";
  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    spinner = (Spinner)findViewById(R.id.spinner);
    button = (Button)findViewById(R.id.button);
    dialog = new ProgressDialog(MainActivity.this);
    button.setOnClickListener(new OnClickListener()
    {
      @Override
      public void onClick(View v)
      {
        dialog.setTitle("提示信息");
        dialog.setMessage("loading......");
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        dialog.setCancelable(false);
        
        new MyAsyncTask().execute(CITY_PATH_JSON);
      }
    });
  }

  public class MyAsyncTask extends AsyncTask<String, Void, List<String>>
  {
    @Override
    protected void onPreExecute()
    {
      dialog.show();
    }
    @Override
    protected List<String> doInBackground(String... params)
    {
      List<String> cities = new ArrayList<String>();
      String citiesString = HttpUtils.sendPostMessage(params[0], "utf-8");
      //  解析服務(wù)器端的json數(shù)據(jù)
      cities = JsonUtils.parseCities(citiesString);return cities;
    }
    @Override
    protected void onPostExecute(List<String> result)
    {
      adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, result);
      adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
      spinner.setAdapter(adapter);
      dialog.dismiss();
    }
  }
  
  @Override
  public boolean onCreateOptionsMenu(Menu menu)
  {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

}

當(dāng)然別往了開啟我們的網(wǎng)絡(luò)授權(quán)

<uses-permission android:name="android.permission.INTERNET"/>

最后我們來看看效果圖:

這樣我們就完成了客戶端與服務(wù)器端通過json來進(jìn)行數(shù)據(jù)的交換

總結(jié):本篇隨筆主要講解了JSON這種輕量級的數(shù)據(jù)交換格式的概念,以及講解了兩種解析json數(shù)據(jù)的解析類(json-lib以及gson),最后通過一個小例子實現(xiàn)了在Android客戶端和服務(wù)器端使用json這種數(shù)據(jù)格式來進(jìn)行數(shù)據(jù)的交換。

原文鏈接:http://www.cnblogs.com/xiaoluo501395377/p/3446605.html
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論