转载:Android学习笔记44:JSON数据解析

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式。

  本文将主要介绍在Android开发中,如何在服务器端创建JSON数据,以及如何在Android客户端对JSON数据进行解析。

1.JSON数据结构

  在JSON中有两种数据结构:对象和数组。

1.1对象

  在JSON中,一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号),冒号后是该名称的值,多个“名称:值”之间使用 “,”(逗号)分隔开来。名称需要使用双引号括起来,值如果是字符串则必须用双引号括起来,如果是数值型则不需要。其结构示意图如图1所示。

图1 JSON对象结构示意图

  如下的代码是一个简单的JSON对象示例:

  1. 1   {
  2. 2   "id":001,
  3. 3   "name":"jack",
  4. 4   "age":25
  5. 5   }

1.2数组

  在JSON中,数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用 “,”(逗号)分隔开来。其结构示意图如图2所示。

图2 JSON数组结构示意图

  如下的代码是一个简单的JSON数组示例:

  1.   ["北京","上海","广州"]

1.3值的类型

  在JSON的对象和数组结构中,value值不仅可以是数字、字符串等简单数据类型,还可以是对象、数组等,如图3所示。

图3 JSON中值的类型

  因此,我们可以使用对象和数组的组合构成复杂的数据结构。如下的代码使用对象结构定义了一个“students”对象,在“students”对象中包含了一个学生数组,而学生数组中的值又是JSON对象。

  1. 1 {
  2. 2 "students":
  3. 3 [
  4. 4 {"name":"jack","age":23},
  5. 5 {"name":"rose","age":24}
  6. 6 ]
  7. 7 }

2.在服务器端生成JSON数据

  通常,客户端在请求服务器数据时,服务器可以使用XML文档、JSON数据或HTML的形式将数据发送给客户端。

  那么如何在服务器端生成JSON数据呢?首先需要完成以下两个准备工作。

  (1)我们需要使用MyEclipse创建了一个Web Project,这里我将该工程命名为了“JsonDemoProject”,用来模拟服务器端的Web服务。

  (2)我们还需要在该工程中导入JSON的API数据包json-lib-2.2.2-jdk15.jar。

  在JSON的API中,提供了JSONObject类,通过调用JSONObject类的put(Object key, Object value)方法,可以将一个Object对象以键值对的形式存入JSONObject对象。通过调用JSONObject类的toString()方法,则可以将JSONObject对象转化为JSON数据。

  如下的代码创建了一个JsonTools类,并实现了静态方法createJsonString(),用来生成JSON数据。

  1. 1   public class JsonTools {
  2. 2   
  3. 3    /*
  4. 4    * Function : 生成JSON数据
  5. 5    * Param   :  key Json数据的键值
  6. 6    * object 要生成Json数据的内容
  7. 7    * Retuen  : JSON数据
  8. 8    * Author  : 博客园-依旧淡然
  9. 9    */
  10. 10    public static String createJsonString(String key, Object value) {
  11. 11    JSONObject jsonObject = new JSONObject(); //创建一个JSONObject对象
  12. 12    jsonObject.put(key, value); //往JSONObject对象中填入内容
  13. 13    return jsonObject.toString(); //生成JSON数据并返回
  14. 14    }
  15. 15   
  16. 16   }

  通过使用该方法,我们可以很方便的将各种数据传递进来,并将其转化成JSON数据。比如,我们可以在JsonService类中,实现一个简单的获取Person对象列表的方法,具体如下:

  1. 1 /*
  2. 2 * Function : 获取Person对象列表
  3. 3 * Author  : 博客园-依旧淡然
  4. 4 */
  5. 5 public List<Person> getListPerson() {
  6. 6 List<Person> list = new ArrayList<Person>();
  7. 7 Person person1 = new Person(001, "jack", 25);
  8. 8 Person person2 = new Person(002, "rose", 24);
  9. 9 Person person3 = new Person(003, "bob", 26);
  10. 10 list.add(person1);
  11. 11 list.add(person2);
  12. 12 list.add(person3);
  13. 13 return list;
  14. 14 }

  其中,Person对象具有id(int)、name(String)和age(int)三个属性。

  最后,我们可以创建一个继承自HttpServlet的JsonAction类,并实现其中的doPost()方法,用来响应客户端对服务器的请求。具体如下:

  1. 1   public void doPost(HttpServletRequest request, HttpServletResponse response)
  2. 2 throws ServletException, IOException {
  3. 3
  4. 4 response.setContentType("text/html;charset=utf-8");
  5. 5 request.setCharacterEncoding("utf-8");
  6. 6 response.setCharacterEncoding("utf-8");
  7. 7 PrintWriter out = response.getWriter();
  8. 8
  9. 9 List<Person> listPerson = jsonService.getListPerson();
  10. 10
  11. 11 String str = null;
  12. 12 String action_flag = request.getParameter("action_flag"); //获取URL参数
  13. 13 if(action_flag.equals("persons")) {
  14. 14 str = JsonTools.createJsonString("persons", listPerson);
  15. 15 }
  16. 16 out.println(str);
  17. 17 out.flush();
  18. 18 out.close();
  19. 19 }

  可以看到,在doPost()方法中,我们通过调用getListPerson()方法获得了Person对象列表listPerson,并将其传入JsonTools.createJsonString()方法中,从而获得了一串JSON数据。

  将该工程发布到Tomcat上,使用浏览器访问该Web工程,可以看到如图4所示的界面,Person对象列表被成功的转化成了JSON数据。

图4 生成的JSON数据

3.在客户端解析JSON数据

  通过上面的步骤,我们已经在服务器上生成了JSON数据。要在我们的Android工程中获取该JSON数据是很容易的,只需要利用Android为我们提供的HttpURLConnection接口访问图4所示的URL即可。

  那么,获取到服务器上的JSON数据以后,如何在Android工程中完成对该JSON数据的解析呢?

  观察图4所示的JSON数据可以看出:

  (1)该JSON数据的最外层是JSONObject,JSONObject的键是“persons”,值是一个JSONArray。

  (2)在JSONArray中又包含了3个JSONObject对象。

  (3)而在内嵌的每一个JSONObject对象中,都有3个键值对的组合。

  分析清楚了JSON数据的构成形式之后,就可以开始着手对其进行解析了。在Android工程中,我们可以创建一个JsonTools类,并实现getListPerson()类方法,用来完成把从服务器获得的Json数据解析出来,还原成Person对象列表。具体代码如下所示:

  1. 1 /*
  2. 2 * Function : 解析JSON数据,还原成Person对象列表
  3. 3 * Param : key Json数据的键值
  4. 4 * jsonString 从服务器获得的Json数据
  5. 5 * Retuen  : Person对象列表
  6. 6 * Author : 博客园-依旧淡然
  7. 7 */
  8. 8 public static List<Person> getListPerson(String key, String jsonString) {
  9. 9 List<Person> list = new ArrayList<Person>();
  10. 10 try {
  11. 11 JSONObject jsonObject = new JSONObject(jsonString); //创建JSONObject对象
  12. 12 JSONArray personArray = jsonObject.getJSONArray(key); //获取JSONObject对象的值,该值是一个JSON数组
  13. 13 for(int i = 0; i < personArray.length(); i++) {
  14. 14 JSONObject personObject = personArray.getJSONObject(i); //获得JSON数组中的每一个JSONObject对象
  15. 15 Person person = new Person();
  16. 16 int id = personObject.getInt("id"); //获得每一个JSONObject对象中的键所对应的值
  17. 17 String name = personObject.getString("name");
  18. 18 int age = personObject.getInt("age");
  19. 19 person.setId(id); //将解析出来的属性值存入Person对象
  20. 20 person.setName(name);
  21. 21 person.setAge(age);
  22. 22 list.add(person); //将解析出来的每一个Person对象添加到List中
  23. 23 }
  24. 24 } catch (JSONException e) {
  25. 25 e.printStackTrace();
  26. 26 }
  27. 27 return list;
  28. 28 }

  在本实例中,点击Button按钮向服务器发送获取JSON数据的请求,从服务器获得JSON数据后,可以使用以上的代码完成对JSON数据的解析,最后将解析得到的Person对象依次显示在TextView控件中。程序运行的结果如图5所示。

          图5 运行结果

转载:Android学习笔记45:JSON数据解析(GSON方式)

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式。

  在上文中,我们使用基本的JSON API完成了在服务器端创建JSON数据,以及在Android客户端对JSON数据进行解析。

  其实,要创建和解析JSON数据,也可以使用GSON来完成。GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。使用GSON,可以很容易的将一串JSON数据转换为一个Java对象,或是将一个Java对象转换为相应的JSON数据。

1.GSON的两个重要方法

  在GSON的API中,提供了两个重要的方法:toJson()和fromJson()方法。其中,toJson()方法用来实现将Java对象转换为相应的JSON数据,fromJson()方法则用来实现将JSON数据转换为相应的Java对象。

1.1 toJson()方法

  toJson()方法用于将Java对象转换为相应的JSON数据,主要有以下几种形式:

  (1)String toJson(JsonElement jsonElement);

  (2)String toJson(Object src);

  (3)String toJson(Object src, Type typeOfSrc);

  其中,方法(1)用于将JsonElement对象(可以是JsonObject、JsonArray等)转换成JSON数据;方法(2)用于将指定的Object对象序列化成相应的JSON数据;方法(3)用于将指定的Object对象(可以包括泛型类型)序列化成相应的JSON数据。

1.2 fromJson()方法

  fromJson()方法用于将JSON数据转换为相应的Java对象,主要有以下几种形式:

  (1)<T> T fromJson(JsonElement json, Class<T> classOfT);

  (2)<T> T fromJson(JsonElement json, Type typeOfT);

  (3)<T> T fromJson(JsonReader reader, Type typeOfT);

  (4)<T> T fromJson(Reader reader, Class<T> classOfT);

  (5)<T> T fromJson(Reader reader, Type typeOfT);

  (6)<T> T fromJson(String json, Class<T> classOfT);

  (7)<T> T fromJson(String json, Type typeOfT);

  以上的方法用于将不同形式的JSON数据解析成Java对象。

2.在服务器端生成JSON数据

  要使用GSON技术在服务器端生成JSON数据,首先需要完成以下两个准备工作。

  (1)使用MyEclipse创建了一个Web Project,这里我将该工程命名为了“GsonDemoProject”,用来模拟服务器端的Web服务。

  (2)往该工程中导入GSON的API数据包gson-2.2.1.jar。

  然后,我们便可以在该工程中创建一个JsonTools工具类,并实现静态方法createJsonString(),在该方法中通过使用GSON技术来生成JSON数据。该方法的具体实现如下。

  1. 1   public class JsonTools {
  2. 2   
  3. 3    /*
  4. 4    * Function : 生成JSON字符串
  5. 5    * Param   :  value 想要转换成JSON字符串的Object对象
  6. 6    * Retuen  : JSON字符串
  7. 7    * Author  : 博客园-依旧淡然
  8. 8    */
  9. 9    public static String createJsonString(Object value) {
  10. 10    Gson gson = new Gson();
  11. 11    String string = gson.toJson(value);
  12. 12    return string;
  13. 13    }
  14. 14   
  15. 15   }

  可以看到,这个方法的具体实现非常简单,首先创建一个Gson对象,然后通过调用Gson对象的toJson()方法,将传进来的value(任意的Java对象)转换成JSON字符串即可。

  通过使用该方法,我们可以很方便的将任意Java对象传递进来,并将其转化成JSON数据。和上一篇博文中一样,我们可以在JsonService类中,实现一个简单的获取Person对象列表的方法,具体如下:

  1. 1 /*
  2. 2 * Function :  获取Person对象列表
  3. 3 * Author  :  博客园-依旧淡然
  4. 4 */
  5. 5 public List<Person> getListPerson() {
  6. 6 List<Person> list = new ArrayList<Person>();
  7. 7 Person person1 = new Person(001, "jack", 25);
  8. 8 Person person2 = new Person(002, "rose", 24);
  9. 9 Person person3 = new Person(003, "bob", 26);
  10. 10 list.add(person1);
  11. 11 list.add(person2);
  12. 12 list.add(person3);
  13. 13 return list;
  14. 14 }

  在该方法中,我们向List列表中加入了3个Person对象,每个Person对象具有id(int)、name(String)和age(int)三个属性。

  最后,我们还需要创建一个继承自HttpServlet的JsonAction类,并实现其中的doPost()方法,用来响应客户端对服务器的请求。具体如下:

  1. 1   public void doPost(HttpServletRequest request, HttpServletResponse response)
  2. 2 throws ServletException, IOException {
  3. 3
  4. 4 response.setContentType("text/html;charset=utf-8");
  5. 5 request.setCharacterEncoding("utf-8");
  6. 6 response.setCharacterEncoding("utf-8");
  7. 7 PrintWriter out = response.getWriter();
  8. 8
  9. 9 List<Person> listPerson = jsonService.getListPerson();
  10. 10
  11. 11 String str = null;
  12. 12 String action_flag = request.getParameter("action_flag");
  13. 13 if(action_flag.equals("persons") {
  14. 14 str = JsonTools.createJsonString(listPerson);
  15. 15 }
  16. 16 out.println(str);
  17. 17 out.flush();
  18. 18 out.close();
  19. 19 }

  在该方法中,我们通过调用JsonService类中的getListPerson()方法获得了Person对象列表listPerson,并将其传入JsonTools.createJsonString()方法中,生成了Person对象列表的JSON数据。将该工程发布到Tomcat上,使用浏览器访问该Web工程,可以看到如图1所示的界面,Person对象列表被成功的转化成了JSON数据。

图1 生成的JSON数据

3.在客户端解析JSON数据

  在Android工程中,我们可以通过HttpURLConnection接口访问图1所示的URL来获得服务器上的JSON数据。

  得到JSON数据之后,便可以通过使用前面提到的fromJson()方法,将图1 所示的JSON数据还原成对应的Person对象列表了。当然了,因为这里使用到了GSON,同样需要向Android工程中导入gson-2.2.1.jar包。具体的实现方法如下。

  1. 1 /*
  2. 2 * Function : 解析JSON数据,还原成Person对象列表
  3. 3 * Param : jsonString 从服务器获得的Json数据
  4. 4 * Retuen  : Person对象列表
  5. 5 * Author : 博客园-依旧淡然
  6. 6 */
  7. 7 public static List<Person> getListPerson(String jsonString) {
  8. 8 List<Person> list = new ArrayList<Person>();
  9. 9 Gson gson = new Gson();
  10. 10 list = gson.fromJson(jsonString, new TypeToken<List<Person>>(){}.getType());
  11. 11 return list;
  12. 12 }

  可以看到,使用GSON解析JSON数据的代码实现也非常简单。其中,TypeToken是GSON提供的数据类型转换器,支持多种数据集合类型转换,其反射机制可以实现将解析出来的Java对象映射到对应的数据集合中。

  在本实例中,同样点击Button按钮向服务器发送获取JSON数据的请求,从服务器获得JSON数据后,使用以上的代码完成对JSON数据的解析,最后将解析得到的Person对象依次显示在TextView控件中。程序运行的结果如图2所示。

        图2 运行结果

解析JSON数据示例:

1. 解析数组格式的JSON数据

  本程序直接使用字符串定义了要输出的数据,由于数据是以“[]”包裹的数组数据,所以直接放到了JSONArray类的构造方法中,之后利用循环的方式取出里面保存的每一个JSONObject数据,而所有的数据最终都被保存在List集合中,返回后采用迭代输出取出每一个数据并在文本显示组件上显示。

activity_my_jsondemo.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:orientation="vertical"
  5. android:layout_width="fill_parent"
  6. android:layout_height="fill_parent"
  7. android:paddingBottom="@dimen/activity_vertical_margin"
  8. android:paddingLeft="@dimen/activity_horizontal_margin"
  9. android:paddingRight="@dimen/activity_horizontal_margin"
  10. android:paddingTop="@dimen/activity_vertical_margin"
  11. tools:context="com.example.myfirst.MyJSONDemo" >
  12.  
  13. <TextView
  14. android:id="@+id/jsonmsg"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"/>
  17.  
  18. </LinearLayout>

MyJSONDemo.java

  1. package com.example.myfirst;
  2.  
  3. import java.io.File;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.PrintStream;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.Iterator;
  10. import java.util.List;
  11. import java.util.Map;
  12.  
  13. import org.json.JSONArray;
  14. import org.json.JSONException;
  15. import org.json.JSONObject;
  16.  
  17. import android.support.v7.app.ActionBarActivity;
  18. import android.os.Bundle;
  19. import android.view.Menu;
  20. import android.view.MenuItem;
  21. import android.widget.TextView;
  22.  
  23. public class MyJSONDemo extends ActionBarActivity {
  24. private TextView jsonmsg = null;
  25. @Override
  26. protected void onCreate(Bundle savedInstanceState) {
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.activity_my_jsondemo);
  29. // String data[] ={"www.mldnjava.cn","lixinghua","bbs.mldn.cn"}; //默认的信息
  30. // JSONObject allData = new JSONObject(); //先建立最外层的allData对象
  31. // JSONArray sing = new JSONArray(); //定义一个新的JSONArray对象
  32. // for(int x=0;x<data.length;x++){
  33. // JSONObject temp = new JSONObject();
  34. // try {
  35. // temp.put("myurl", data[x]);
  36. // } catch (JSONException e) {
  37. // // TODO Auto-generated catch block
  38. // e.printStackTrace();
  39. // }
  40. // sing.put(temp); //保存一个信息
  41. // }
  42. // try {
  43. // allData.put("urldata", sing);
  44. // } catch (JSONException e) {
  45. // // TODO Auto-generated catch block
  46. // e.printStackTrace();
  47. // }
  48. // File file = new File("/data/data/com.example.myfirst/files/json.txt");
  49. // if(!file.getParentFile().exists()){ //父文件夹不存在
  50. // file.getParentFile().mkdirs(); //创建文件夹
  51. // }
  52. // PrintStream out = null; //打印流
  53. // try {
  54. // out = new PrintStream(new FileOutputStream(file)); //实例化打印流对象
  55. // out.print(allData.toString()); //输出数据
  56. // } catch (FileNotFoundException e) {
  57. // // TODO Auto-generated catch block
  58. // e.printStackTrace();
  59. // }finally{
  60. // if(out!=null){
  61. // out.close();
  62. // }
  63. // }
  64. this.jsonmsg = (TextView) super.findViewById(R.id.jsonmsg);
  65. String str = "[{\"id\":1,\"name\":\"李兴华\",\"age\":30},"
  66. +"{\"id\":2,\"name\":\"MLDN\",\"age\":10}]"; //定义JSON数据
  67. StringBuffer buf = new StringBuffer(); //保存数据
  68. try {
  69. List<Map<String,Object>> all = this.parseJson(str); //解析JSON文本
  70. Iterator<Map<String, Object>> iter = all.iterator(); //实例化Iterator
  71. while(iter.hasNext()){
  72. Map<String, Object> map = iter.next(); //取出每一个保存的数据
  73. buf.append("ID:"+map.get("id")+",姓名:"+map.get("name")+",年龄"+map.get("age")+"\n");
  74. }
  75. } catch (Exception e) {
  76. // TODO Auto-generated catch block
  77. e.printStackTrace();
  78. }
  79. this.jsonmsg.setText(buf.toString());
  80. }
  81.  
  82. public List<Map<String,Object>> parseJson(String data) throws Exception{
  83. List<Map<String,Object>> all = new ArrayList<Map<String,Object>>();
  84. JSONArray jsonArr = new JSONArray(data); //定义JSON数组
  85. for(int x=0;x<jsonArr.length();x++){
  86. Map<String,Object> map = new HashMap<String,Object>();
  87. JSONObject jsonObj = jsonArr.getJSONObject(x); //取出数组中的JSONObject
  88. map.put("id", jsonObj.getInt("id"));
  89. map.put("name", jsonObj.getString("name"));
  90. map.put("age", jsonObj.getInt("age"));
  91. all.add(map); //向集合中保存
  92. }
  93. return all; //返回全部记录
  94. }
  95. @Override
  96. public boolean onCreateOptionsMenu(Menu menu) {
  97. // Inflate the menu; this adds items to the action bar if it is present.
  98. getMenuInflater().inflate(R.menu.my_jsondemo, menu);
  99. return true;
  100. }
  101.  
  102. @Override
  103. public boolean onOptionsItemSelected(MenuItem item) {
  104. // Handle action bar item clicks here. The action bar will
  105. // automatically handle clicks on the Home/Up button, so long
  106. // as you specify a parent activity in AndroidManifest.xml.
  107. int id = item.getItemId();
  108. if (id == R.id.action_settings) {
  109. return true;
  110. }
  111. return super.onOptionsItemSelected(item);
  112. }
  113. }

程序运行结果如下:

2.解析复杂格式的JSON数据

  本程序直接解析了一个JSON文本数据,为用户演示如何进行解析。

  activity_my_jsondemo.xml文件内容同上。

MyJSONDemo.java

  1. package com.example.myfirst;
  2.  
  3. import java.io.File;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.PrintStream;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.Iterator;
  10. import java.util.List;
  11. import java.util.Map;
  12.  
  13. import org.json.JSONArray;
  14. import org.json.JSONException;
  15. import org.json.JSONObject;
  16.  
  17. import android.support.v7.app.ActionBarActivity;
  18. import android.os.Bundle;
  19. import android.view.Menu;
  20. import android.view.MenuItem;
  21. import android.widget.TextView;
  22.  
  23. public class MyJSONDemo extends ActionBarActivity {
  24. private TextView jsonmsg = null;
  25. @Override
  26. protected void onCreate(Bundle savedInstanceState) {
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.activity_my_jsondemo);
  29. this.setTitle("JSON数据解析");
  30. //1. String data[] ={"www.mldnjava.cn","lixinghua","bbs.mldn.cn"}; //默认的信息
  31. // JSONObject allData = new JSONObject(); //先建立最外层的allData对象
  32. // JSONArray sing = new JSONArray(); //定义一个新的JSONArray对象
  33. // for(int x=0;x<data.length;x++){
  34. // JSONObject temp = new JSONObject();
  35. // try {
  36. // temp.put("myurl", data[x]);
  37. // } catch (JSONException e) {
  38. // // TODO Auto-generated catch block
  39. // e.printStackTrace();
  40. // }
  41. // sing.put(temp); //保存一个信息
  42. // }
  43. // try {
  44. // allData.put("urldata", sing);
  45. // } catch (JSONException e) {
  46. // // TODO Auto-generated catch block
  47. // e.printStackTrace();
  48. // }
  49. // File file = new File("/data/data/com.example.myfirst/files/json.txt");
  50. // if(!file.getParentFile().exists()){ //父文件夹不存在
  51. // file.getParentFile().mkdirs(); //创建文件夹
  52. // }
  53. // PrintStream out = null; //打印流
  54. // try {
  55. // out = new PrintStream(new FileOutputStream(file)); //实例化打印流对象
  56. // out.print(allData.toString()); //输出数据
  57. // } catch (FileNotFoundException e) {
  58. // // TODO Auto-generated catch block
  59. // e.printStackTrace();
  60. // }finally{
  61. // if(out!=null){
  62. // out.close();
  63. // }
  64. // }
  65. //2. this.jsonmsg = (TextView) super.findViewById(R.id.jsonmsg);
  66. // String str = "[{\"id\":1,\"name\":\"李兴华\",\"age\":30},"
  67. // +"{\"id\":2,\"name\":\"MLDN\",\"age\":10}]"; //定义JSON数据
  68. // StringBuffer buf = new StringBuffer(); //保存数据
  69. // try {
  70. // List<Map<String,Object>> all = this.parseJson(str); //解析JSON文本
  71. // Iterator<Map<String, Object>> iter = all.iterator(); //实例化Iterator
  72. // while(iter.hasNext()){
  73. // Map<String, Object> map = iter.next(); //取出每一个保存的数据
  74. // buf.append("ID:"+map.get("id")+",姓名:"+map.get("name")+",年龄"+map.get("age")+"\n");
  75. // }
  76. // } catch (Exception e) {
  77. // // TODO Auto-generated catch block
  78. // e.printStackTrace();
  79. // }
  80. // this.jsonmsg.setText(buf.toString());
  81. this.jsonmsg = (TextView) super.findViewById(R.id.jsonmsg);
  82. String str = "{\"memberdata\":"+
  83. "[{\"id\":1,\"name\":\"李兴华\",\"age\":30},"
  84. +"{\"id\":2,\"name\":\"MLDN\",\"age\":10}],"
  85. +"\"company\":\"北京魔乐科技软件学院\"}"; //定义JSON数据
  86. StringBuffer buf = new StringBuffer(); //保存数据
  87. try {
  88. Map<String,Object> allMap = this.parseJson(str); //解析JSON文本
  89. buf.append("公司名称:"+allMap.get("company")+"\n");
  90. List<Map<String, Object>> all = (List<Map<String, Object>>) allMap.get("memberdata");
  91. Iterator<Map<String, Object>> iter = all.iterator(); //实例化Iterator
  92. while(iter.hasNext()){
  93. Map<String, Object> map = iter.next(); //取出每一个保存的数据
  94. buf.append("ID:"+map.get("id")+",姓名:"+map.get("name")+",年龄"+map.get("age")+"\n");
  95. }
  96. } catch (Exception e) {
  97. // TODO Auto-generated catch block
  98. e.printStackTrace();
  99. }
  100. this.jsonmsg.setText(buf);
  101. }
  102.  
  103. //2. public List<Map<String,Object>> parseJson(String data) throws Exception{
  104. // List<Map<String,Object>> all = new ArrayList<Map<String,Object>>();
  105. // JSONArray jsonArr = new JSONArray(data); //定义JSON数组
  106. // for(int x=0;x<jsonArr.length();x++){
  107. // Map<String,Object> map = new HashMap<String,Object>();
  108. // JSONObject jsonObj = jsonArr.getJSONObject(x); //取出数组中的JSONObject
  109. // map.put("id", jsonObj.getInt("id"));
  110. // map.put("name", jsonObj.getString("name"));
  111. // map.put("age", jsonObj.getInt("age"));
  112. // all.add(map); //向集合中保存
  113. // }
  114. // return all; //返回全部记录
  115. // }
  116. public Map<String,Object> parseJson(String data) throws Exception{
  117. Map<String,Object> allMap = new HashMap<String,Object>();
  118. JSONObject allData = new JSONObject(data); //定义JSONObject
  119. allMap.put("company", allData.getString("company")); //取出并设置company
  120. JSONArray jsonArr = allData.getJSONArray("memberdata"); //取出JSONArray
  121. List<Map<String, Object>> all = new ArrayList<Map<String, Object>>();
  122. for(int x=0;x<jsonArr.length();x++){
  123. Map<String,Object> map = new HashMap<String,Object>();
  124. JSONObject jsonObj = jsonArr.getJSONObject(x); //取出数组中的JSONObject
  125. map.put("id", jsonObj.getInt("id"));
  126. map.put("name", jsonObj.getString("name"));
  127. map.put("age", jsonObj.getInt("age"));
  128. all.add(map); //向集合中保存
  129. }
  130. allMap.put("memberdata", all); //保存集合
  131. return allMap; //返回全部记录
  132. }
  133. @Override
  134. public boolean onCreateOptionsMenu(Menu menu) {
  135. // Inflate the menu; this adds items to the action bar if it is present.
  136. getMenuInflater().inflate(R.menu.my_jsondemo, menu);
  137. return true;
  138. }
  139.  
  140. @Override
  141. public boolean onOptionsItemSelected(MenuItem item) {
  142. // Handle action bar item clicks here. The action bar will
  143. // automatically handle clicks on the Home/Up button, so long
  144. // as you specify a parent activity in AndroidManifest.xml.
  145. int id = item.getItemId();
  146. if (id == R.id.action_settings) {
  147. return true;
  148. }
  149. return super.onOptionsItemSelected(item);
  150. }
  151. }

  本程序定义的JSON数据格式中,除了数组之外,还有一个普通的文本数据,所以在进行解析之前首先实例化JSONObject类的对象,之后再通过JSONObject取出了里面保存的数组数据,并将数据设置到了TextView中显示,程序的运行效果如下所示:

Android学习笔记之JSON数据解析的更多相关文章

  1. springmvc学习笔记(18)-json数据交互

    springmvc学习笔记(18)-json数据交互 标签: springmvc springmvc学习笔记18-json数据交互 springmvc进行json交互 环境准备 加入json转换的依赖 ...

  2. Android学习笔记之Json的使用....

    PS:当你的能力还驾驭不了你的目标时,那你需要沉下心来历练... 学习内容: 1.Json的使用... 2.Json信息过滤... 3.从网络上获取Json数据... 4.解析Json数据获取各个属性 ...

  3. Solr学习笔记——导入JSON数据

    1.导入JSON数据的方式有两种,一种是在web管理界面中导入,另一种是使用curl命令来导入 curl http://localhost:8983/solr/baikeperson/update/j ...

  4. node.js学习笔记之json数据转string

    Node.js中的JSON问题   var str = '{"dir":"kunhony","param":"archive&qu ...

  5. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  6. iOS学习笔记(十一)——JSON数据解析

    在之前的<iOS学习——xml数据解析(九)>介绍了xml数据解析,这一篇简单介绍一下Json数据解析.JSON 即 JavaScript Object Natation,它是一种轻量级的 ...

  7. Android学习笔记之Fast Json的使用

    PS:最近这两天发现了Fast Json 感觉实在是强大.. 学习内容: 1.什么是Fast Json 2.如何使用Fast Json 3.Fast Json的相关原理 4.Fast Json的优势, ...

  8. iOS学习——JSON数据解析(十一)

    在之前的<iOS学习——xml数据解析(九)>介绍了xml数据解析,这一篇简单介绍一下Json数据解析.JSON 即 JavaScript Object Natation,它是一种轻量级的 ...

  9. 【转】 Pro Android学习笔记(七十):HTTP服务(4):SOAP/JSON/XML、异常

    目录(?)[-] SOAP JSON和XMLPullParser Exception处理 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog. ...

随机推荐

  1. Vi的基本使用方法

    转载自http://linux.chinaunix.net/doc/office/2005-01-24/898.shtml vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何 ...

  2. Java Web高性能开发(三)

    今日要闻: Clarifai:可识别视频中物体 最近几年,得益于深度学习技术的发展,谷歌和Facebook等企业的研究人员在图形识别软件领域取得了重大突破.现在,一家名为Clarifai的创业公司则提 ...

  3. Java基础 —— JavaScript

    Javascript:基于对象与事件驱动的脚本语言,主要用于客户端 特点: 交互性:信息动态交互. 安全性:不能访问本地硬盘. 跨平台性:只要有浏览器就支持Javascript,与平台无关. Java ...

  4. jquery获取显示器,屏幕的宽度,和高度

    Javascript: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.b ...

  5. MyEclipse 代码自动提示

    默认 myeclipse,输入.才会出现代码提示,不能根据单词前缀提示. 按以下设置就很爽了 .abcdefghijklmnopqrstuvwxyz(,

  6. Clean Code第二章<命名>

    1.命名要有意义 错误写法 正确写法 2.某些构造函数可以提供有意义的静态方法去实现

  7. Unix 哲学

    1.模块原则:使用简洁的接口拼接简单的部件 2.清晰原则:清晰胜于机巧 3.组合原则:设计时考虑拼接组合 4.分离原则:策略同机制分离,接口同引擎分离. 5.简洁原则:设计要简洁,复杂度能低则低 6. ...

  8. all & any

    def all(*args, **kwargs): """ Return True if bool(x) is True for all values x in the ...

  9. oracle常见小问题解答ORA-01008,ORA-01036

    第一个问题,参数传的空值,需要检查参数们有没有空值的情况 第二个问题,与MSSQL不同的是,.net使用参数化调用oracle不加@加的是:,然后在参数化语句里面可以省略:冒号,如果不这么写,就会出现 ...

  10. LDS,LES,LFS,LGS,LSS指令

    LDS,LES,LFS,LGS,LSS其指令格式都是         LDS reg16,mem32 其意义是同时给一个段寄存器和一个16位通用寄存器同时赋值 具体如下:reg16=mem32的低字, ...