• Android学习笔记之JSON数据解析


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

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

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

    1.JSON数据结构

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

    1.1对象

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

    图1 JSON对象结构示意图

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

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

    1.2数组

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

    图2 JSON数组结构示意图

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

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

    1.3值的类型

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

    图3 JSON中值的类型

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

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

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

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

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

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

    复制代码
     1   public void doPost(HttpServletRequest request, HttpServletResponse response)
     2             throws ServletException, IOException {
     3 
     4         response.setContentType("text/html;charset=utf-8");
     5         request.setCharacterEncoding("utf-8");
     6         response.setCharacterEncoding("utf-8");
     7         PrintWriter out = response.getWriter();
     8         
     9         List<Person> listPerson = jsonService.getListPerson();
    10         
    11         String str = null;
    12         String action_flag = request.getParameter("action_flag");    //获取URL参数
    13         if(action_flag.equals("persons")) {
    14             str = JsonTools.createJsonString("persons", listPerson);
    15         }
    16         out.println(str);
    17         out.flush();
    18         out.close();
    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     /*
     2      * Function  :   解析JSON数据,还原成Person对象列表
     3      * Param     :   key            Json数据的键值
     4      *               jsonString     从服务器获得的Json数据
     5      * Retuen   :   Person对象列表
     6      * Author    :   博客园-依旧淡然
     7      */
     8     public static List<Person> getListPerson(String key, String jsonString) {
     9         List<Person> list = new ArrayList<Person>();
    10         try {
    11             JSONObject jsonObject = new JSONObject(jsonString);          //创建JSONObject对象
    12             JSONArray personArray = jsonObject.getJSONArray(key);        //获取JSONObject对象的值,该值是一个JSON数组
    13             for(int i = 0; i < personArray.length(); i++) {
    14                 JSONObject personObject = personArray.getJSONObject(i);  //获得JSON数组中的每一个JSONObject对象
    15                 Person person = new Person();
    16                 int id = personObject.getInt("id");                      //获得每一个JSONObject对象中的键所对应的值
    17                 String name = personObject.getString("name");
    18                 int age = personObject.getInt("age");
    19                 person.setId(id);        //将解析出来的属性值存入Person对象
    20                 person.setName(name);
    21                 person.setAge(age);
    22                 list.add(person);        //将解析出来的每一个Person对象添加到List中
    23             }
    24         } catch (JSONException e) {
    25             e.printStackTrace();
    26         }
    27         return list;
    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   public class JsonTools {
     2       
     3       /*
     4        * Function :   生成JSON字符串
     5        * Param   :   value     想要转换成JSON字符串的Object对象
     6        * Retuen  :   JSON字符串
     7        * Author  :   博客园-依旧淡然
     8        */
     9       public static String createJsonString(Object value) {
    10           Gson gson = new Gson();
    11           String string = gson.toJson(value);
    12           return string;
    13       }
    14       
    15   }
    复制代码

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

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

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

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

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

    复制代码
     1   public void doPost(HttpServletRequest request, HttpServletResponse response)
     2             throws ServletException, IOException {
     3 
     4         response.setContentType("text/html;charset=utf-8");
     5         request.setCharacterEncoding("utf-8");
     6         response.setCharacterEncoding("utf-8");
     7         PrintWriter out = response.getWriter();
     8         
     9         List<Person> listPerson = jsonService.getListPerson();
    10         
    11         String str = null;
    12         String action_flag = request.getParameter("action_flag");
    13         if(action_flag.equals("persons") {
    14             str = JsonTools.createJsonString(listPerson);
    15         }
    16         out.println(str);
    17         out.flush();
    18         out.close();
    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     /*
     2      * Function  :   解析JSON数据,还原成Person对象列表
     3      * Param     :   jsonString         从服务器获得的Json数据
     4      * Retuen   :   Person对象列表
     5      * Author    :   博客园-依旧淡然
     6      */
     7     public static List<Person> getListPerson(String jsonString) {
     8         List<Person> list = new ArrayList<Person>();
     9         Gson gson = new Gson();
    10         list = gson.fromJson(jsonString, new TypeToken<List<Person>>(){}.getType());
    11         return list;
    12     }
    复制代码

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

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

            图2 运行结果

    解析JSON数据示例:

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

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

    activity_my_jsondemo.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.myfirst.MyJSONDemo" >
    
        <TextView
            android:id="@+id/jsonmsg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    
    </LinearLayout>

    MyJSONDemo.java

    package com.example.myfirst;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.PrintStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.TextView;
    
    public class MyJSONDemo extends ActionBarActivity {
        private TextView jsonmsg = null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_my_jsondemo);
    //        String data[] ={"www.mldnjava.cn","lixinghua","bbs.mldn.cn"}; //默认的信息
    //        JSONObject allData = new JSONObject(); //先建立最外层的allData对象
    //        JSONArray sing = new JSONArray();  //定义一个新的JSONArray对象
    //        for(int x=0;x<data.length;x++){
    //            JSONObject temp = new JSONObject();
    //            try {
    //                temp.put("myurl", data[x]);
    //            } catch (JSONException e) {
    //                // TODO Auto-generated catch block
    //                e.printStackTrace();
    //            }
    //            sing.put(temp);   //保存一个信息
    //        }
    //        try {
    //            allData.put("urldata", sing);
    //        } catch (JSONException e) {
    //            // TODO Auto-generated catch block
    //            e.printStackTrace();
    //        }
    //        File file = new File("/data/data/com.example.myfirst/files/json.txt");
    //        if(!file.getParentFile().exists()){ //父文件夹不存在
    //            file.getParentFile().mkdirs();  //创建文件夹
    //        }
    //        PrintStream out = null;  //打印流
    //        try {
    //            out = new PrintStream(new FileOutputStream(file));  //实例化打印流对象
    //            out.print(allData.toString());  //输出数据
    //        } catch (FileNotFoundException e) {
    //            // TODO Auto-generated catch block
    //            e.printStackTrace();
    //        }finally{
    //            if(out!=null){
    //                out.close();
    //            }
    //        }
            this.jsonmsg = (TextView) super.findViewById(R.id.jsonmsg);
            String str = "[{"id":1,"name":"李兴华","age":30},"
                    +"{"id":2,"name":"MLDN","age":10}]"; //定义JSON数据
            StringBuffer buf = new StringBuffer();  //保存数据
            try {
                List<Map<String,Object>> all = this.parseJson(str);  //解析JSON文本
                Iterator<Map<String, Object>> iter = all.iterator();  //实例化Iterator
                while(iter.hasNext()){
                    Map<String, Object> map = iter.next();  //取出每一个保存的数据
                    buf.append("ID:"+map.get("id")+",姓名:"+map.get("name")+",年龄"+map.get("age")+"
    ");
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            this.jsonmsg.setText(buf.toString());
        }
    
        public List<Map<String,Object>> parseJson(String data) throws Exception{
            List<Map<String,Object>> all = new ArrayList<Map<String,Object>>();
            JSONArray jsonArr = new JSONArray(data);  //定义JSON数组
            for(int x=0;x<jsonArr.length();x++){
                Map<String,Object> map = new HashMap<String,Object>();
                JSONObject jsonObj = jsonArr.getJSONObject(x);  //取出数组中的JSONObject
                map.put("id", jsonObj.getInt("id"));
                map.put("name", jsonObj.getString("name"));
                map.put("age", jsonObj.getInt("age"));
                all.add(map);  //向集合中保存
            }
            return all;  //返回全部记录
        }
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.my_jsondemo, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }

    程序运行结果如下:

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

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

       activity_my_jsondemo.xml文件内容同上。

    MyJSONDemo.java

    package com.example.myfirst;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.PrintStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.TextView;
    
    public class MyJSONDemo extends ActionBarActivity {
        private TextView jsonmsg = null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_my_jsondemo);
            this.setTitle("JSON数据解析");
    //1.        String data[] ={"www.mldnjava.cn","lixinghua","bbs.mldn.cn"}; //默认的信息
    //        JSONObject allData = new JSONObject(); //先建立最外层的allData对象
    //        JSONArray sing = new JSONArray();  //定义一个新的JSONArray对象
    //        for(int x=0;x<data.length;x++){
    //            JSONObject temp = new JSONObject();
    //            try {
    //                temp.put("myurl", data[x]);
    //            } catch (JSONException e) {
    //                // TODO Auto-generated catch block
    //                e.printStackTrace();
    //            }
    //            sing.put(temp);   //保存一个信息
    //        }
    //        try {
    //            allData.put("urldata", sing);
    //        } catch (JSONException e) {
    //            // TODO Auto-generated catch block
    //            e.printStackTrace();
    //        }
    //        File file = new File("/data/data/com.example.myfirst/files/json.txt");
    //        if(!file.getParentFile().exists()){ //父文件夹不存在
    //            file.getParentFile().mkdirs();  //创建文件夹
    //        }
    //        PrintStream out = null;  //打印流
    //        try {
    //            out = new PrintStream(new FileOutputStream(file));  //实例化打印流对象
    //            out.print(allData.toString());  //输出数据
    //        } catch (FileNotFoundException e) {
    //            // TODO Auto-generated catch block
    //            e.printStackTrace();
    //        }finally{
    //            if(out!=null){
    //                out.close();
    //            }
    //        }
    //2.        this.jsonmsg = (TextView) super.findViewById(R.id.jsonmsg);
    //        String str = "[{"id":1,"name":"李兴华","age":30},"
    //                +"{"id":2,"name":"MLDN","age":10}]"; //定义JSON数据
    //        StringBuffer buf = new StringBuffer();  //保存数据
    //        try {
    //            List<Map<String,Object>> all = this.parseJson(str);  //解析JSON文本
    //            Iterator<Map<String, Object>> iter = all.iterator();  //实例化Iterator
    //            while(iter.hasNext()){
    //                Map<String, Object> map = iter.next();  //取出每一个保存的数据
    //                buf.append("ID:"+map.get("id")+",姓名:"+map.get("name")+",年龄"+map.get("age")+"
    ");
    //            }
    //        } catch (Exception e) {
    //            // TODO Auto-generated catch block
    //            e.printStackTrace();
    //        }
    //        this.jsonmsg.setText(buf.toString());
            this.jsonmsg = (TextView) super.findViewById(R.id.jsonmsg);
            String str = "{"memberdata":"+
                    "[{"id":1,"name":"李兴华","age":30},"
                    +"{"id":2,"name":"MLDN","age":10}],"
                    +""company":"北京魔乐科技软件学院"}"; //定义JSON数据
            StringBuffer buf = new StringBuffer();  //保存数据
            try {
                Map<String,Object> allMap = this.parseJson(str);  //解析JSON文本
                buf.append("公司名称:"+allMap.get("company")+"
    ");
                List<Map<String, Object>> all = (List<Map<String, Object>>) allMap.get("memberdata");
                Iterator<Map<String, Object>> iter = all.iterator();  //实例化Iterator
                while(iter.hasNext()){
                    Map<String, Object> map = iter.next();  //取出每一个保存的数据
                    buf.append("ID:"+map.get("id")+",姓名:"+map.get("name")+",年龄"+map.get("age")+"
    ");
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            this.jsonmsg.setText(buf);
        }
    
    //2.    public List<Map<String,Object>> parseJson(String data) throws Exception{
    //        List<Map<String,Object>> all = new ArrayList<Map<String,Object>>();
    //        JSONArray jsonArr = new JSONArray(data);  //定义JSON数组
    //        for(int x=0;x<jsonArr.length();x++){
    //            Map<String,Object> map = new HashMap<String,Object>();
    //            JSONObject jsonObj = jsonArr.getJSONObject(x);  //取出数组中的JSONObject
    //            map.put("id", jsonObj.getInt("id"));
    //            map.put("name", jsonObj.getString("name"));
    //            map.put("age", jsonObj.getInt("age"));
    //            all.add(map);  //向集合中保存
    //        }
    //        return all;  //返回全部记录
    //    }
        public Map<String,Object> parseJson(String data) throws Exception{
            Map<String,Object> allMap = new HashMap<String,Object>();
            JSONObject allData = new JSONObject(data);  //定义JSONObject
            allMap.put("company", allData.getString("company"));  //取出并设置company
            JSONArray jsonArr = allData.getJSONArray("memberdata");  //取出JSONArray
            List<Map<String, Object>> all = new ArrayList<Map<String, Object>>();
            for(int x=0;x<jsonArr.length();x++){
                Map<String,Object> map = new HashMap<String,Object>();
                JSONObject jsonObj = jsonArr.getJSONObject(x);  //取出数组中的JSONObject
                map.put("id", jsonObj.getInt("id"));
                map.put("name", jsonObj.getString("name"));
                map.put("age", jsonObj.getInt("age"));
                all.add(map);  //向集合中保存
            }
            allMap.put("memberdata", all);  //保存集合
            return allMap;  //返回全部记录
        }
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.my_jsondemo, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }

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

  • 相关阅读:
    本人作品
    转本笔记计算机理论
    markdown
    javascript的原型链解析(相信你也可以)
    思考 | 执行 delete from t1 where id = 10;MySQL会加什么锁?
    ORA00439: 未启用功能: Deferred Segment Creation
    思考 | select…for update会锁表还是锁行?
    DMS迁移MySQL源限制
    属性文件加载
    视频流推送到公网播放
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4588677.html
Copyright © 2020-2023  润新知