Java创建和解析Json数据方法(二)——org.json包的使用

(二)org.json包的使用

1.简介

  工具包org.json.jar,是一个轻量级的,JAVA下的json构造和解析工具包,它还包含JSON与XML, HTTP headers, Cookies,  CDL的转换。
        这篇学习笔记,主要介绍常用的一些类如:JSONObject、JSONArray、JSONStringer等的一些用法;介绍了如何将Map、Collection、Java Bean等对象转化为json数据;介绍了如何使用org.json包解析json数据等。
        工具包org.json.jar的下载: http://download.csdn.net/detail/zen99t/9398584

2.常用类

Java创建和解析Json数据方法(二)——org.json包的使用_第1张图片

        各种类的用法可以去官网看说明,很详细: http://www.json.org/java/index.html

3.构造json的示例用法

3.1 JSONObject.java

        官网给出的JSONObject的构造函数如下:
Java创建和解析Json数据方法(二)——org.json包的使用_第2张图片
        比较常用就是传入String、map或者bean来构造JSON对象,代码例子如下:
首先定义一个java bean类:
[java] view plain copy
  1. package orgjson;  
  2.   
  3. /** 
  4.  * 包含getter和setter的java bean类 
  5.  * @author Zen9 
  6.  */  
  7. public class Student {  
  8.     private String name;  
  9.     private String sex;  
  10.     private int age;  
  11.       
  12.     public String getName() {  
  13.         return name;  
  14.     }  
  15.     public void setName(String name) {  
  16.         this.name = name;  
  17.     }  
  18.     public String getSex() {  
  19.         return sex;  
  20.     }  
  21.     public void setSex(String sex) {  
  22.         this.sex = sex;  
  23.     }  
  24.     public int getAge() {  
  25.         return age;  
  26.     }  
  27.     public void setAge(int age) {  
  28.         this.age = age;  
  29.     }  
  30. }  
然后测试构造方法;也可以用put方法来向JSON对象中添加key/value对,当用put方法时候,value值可以是int、double、String、、boolean、collection、Map等等,但不可以为bean类型,代码如下:
[java] view plain copy
  1. package orgjson;  
  2. import java.util.ArrayList;  
  3. import java.util.HashMap;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6. import org.json.*;  
  7. public class JsonTest {  
  8.     public static void constructorTest() {  
  9.           
  10.         String jsonStr = "{'name':'JTZen9','age':21}";  
  11.         JSONObject strJson = new JSONObject(jsonStr); // 传入字符串  
  12.         System.out.println("构造参数为String类:" + strJson);  
  13.   
  14.         Map map = new HashMap();  
  15.         map.put("age"21);  
  16.         map.put("sex""male");  
  17.         map.put("name""JTZen9");  
  18.         JSONObject mapJson = new JSONObject(map); // 传入Map类型  
  19.         System.out.println("构造参数为Map类:" + mapJson);  
  20.   
  21.         Student student = new Student();  
  22.         student.setAge(21);  
  23.         student.setName("JTZen9");  
  24.         student.setSex("male");  
  25.         JSONObject beanJson = new JSONObject(student); // 传入Bean类型  
  26.         System.out.println("构造参数为Bean类:" + beanJson);  
  27.     }  
  28.   
  29.     public static void putMethodTest() {  
  30.           
  31.         JSONObject jsonObject1 = new JSONObject();  
  32.         jsonObject1.put("bookName""JTZen9");  
  33.         jsonObject1.put("age"21);  
  34.         System.out.println(jsonObject1);  
  35.           
  36.         JSONObject jsonObject2 = new JSONObject();  
  37.         List list = new ArrayList();  
  38.         for (int i = 1; i < 3; i++) {  
  39.             Map""> map = new HashMap"">();  
  40.             map.put("title""java程序设计 第" + i + "版");  
  41.             map.put("price", i*20);  
  42.             list.add(map);  
  43.         }  
  44.         jsonObject2.put("book", list);  
  45.         System.out.println(jsonObject2);  
  46.           
  47.         Student student = new Student();  
  48.         student.setAge(21);  
  49.         student.setName("JTZen9");  
  50.         student.setSex("male");  
  51.         jsonObject2 = new JSONObject(student);  
  52.         JSONObject jsonObject3 = new JSONObject();  
  53.         jsonObject3.put("people", jsonObject2);   //不可以直接传bean类对象put("people",student)  
  54.         System.out.println(jsonObject3);  
  55.     }  
  56.   
  57.     public static void main(String[] args) throws Exception {  
  58.         constructorTest();  
  59.         System.out.println("---------------------------------------------------------");  
  60.         putMethodTest();  
  61.     }  
  62. }  
  63. 输出结果:
    Java创建和解析Json数据方法(二)——org.json包的使用_第3张图片

    3.2 JSONArray.java

    1.构造函数

            官网上的JSONObject的构造函数如下:
    Java创建和解析Json数据方法(二)——org.json包的使用_第4张图片
            这里用Collection、String和Object型的array作为参数,给出例子如下:
    [java] view plain copy
    1. package orgjson;  
    2. import java.util.ArrayList;  
    3. import java.util.HashMap;  
    4. import java.util.List;  
    5. import java.util.Map;  
    6. import org.json.*;  
    7. public class JsonArrayTest {  
    8.     public static void constructorTest() {  
    9.           
    10.         String jsonStr = "[{'name':'JTZen9','age':21}]";  
    11.         JSONArray strJson = new JSONArray(jsonStr);     // 传入字符串  
    12.         System.out.println("构造参数为String类:" + strJson);  
    13.   
    14.         List list = new ArrayList();  
    15.         for (int i = 1; i < 3; i++) {  
    16.             Map""> map = new HashMap"">();  
    17.             map.put("title""java程序设计 第" + i + "版");  
    18.             map.put("price", i*20);  
    19.             list.add(map);  
    20.         }  
    21.         JSONArray mapJson = new JSONArray(list);        // 传入Collection类型  
    22.         System.out.println("构造参数为Collection类:" + mapJson);  
    23.   
    24.         int[] numlist = new int[10];  
    25.         for (int i = 0; i < numlist.length; i++) {  
    26.             numlist[i] = i;  
    27.         }  
    28.         JSONArray arrayJson = new JSONArray(numlist);   // 传入Array类型,实例1  
    29.         System.out.println(arrayJson);  
    30.           
    31.         Student[] student = {new Student(),new Student()};  
    32.         student[0].setAge(21);  
    33.         student[0].setName("JTZen9");  
    34.         student[0].setSex("male");  
    35.         student[1].setAge(21);  
    36.         student[1].setName("heiheihei");  
    37.         student[1].setSex("female");  
    38.         JSONArray beanJson = new JSONArray(student);    // 传入Array类型,实例2  
    39.         System.out.println("构造参数为Array类:" + beanJson);  
    40.     }  
    41.       
    42.     public static void main(String[] args) {  
    43.         constructorTest();  
    44.     }  
    45. }  
    46.         输出结果如下:

      2.put方法创建

              put方法中可以直接将int、double、Collection、Map等加进去,也可以添加下标来指定添加的位置:put(int index, java.util.Map value) ,使用put方法构造的JSON数组,如果传入的是数组,都会自动加一对中括号[ ],那么出来的结果就会有两层的中括号[ ],代码例子如下: 
      [java] view plain copy
      1. package orgjson;  
      2. import java.util.HashMap;  
      3. import java.util.Map;  
      4. import org.json.*;  
      5. public class JSONArrayTest {  
      6.     public static void putMethodTest() {  
      7.         JSONArray jsonArray1 = new JSONArray();  
      8.         jsonArray1.put("JTZen9");  
      9.         jsonArray1.put(21);  
      10.         jsonArray1.put("male");  
      11.         System.out.println(jsonArray1);  
      12.   
      13.         JSONArray jsonArray2 = new JSONArray();  
      14.         Map""> map = new HashMap"">();  
      15.         map.put("title""java程序设计 第2版");  
      16.         map.put("price"20);  
      17.         jsonArray2.put(map);        //传入一个map  
      18.         System.out.println("传入一个Map:" + jsonArray2);  
      19.         map.clear();  
      20.         map.put("title""java程序设计 第3版");  
      21.         map.put("price"30);  
      22.         jsonArray2.put(map);        //没有下标的直接在结果后面添加  
      23.         System.out.println("没有指定下标:" + jsonArray2);  
      24.         map.clear();  
      25.         map.put("title""java程序设计 第1版");  
      26.         map.put("price"10);  
      27.         jsonArray2.put(0,map);      //使用下标可以添加到自定义的位置  
      28.         System.out.println("添加到第一个位置:" + jsonArray2);  
      29.           
      30.         Student[] student = { new Student(), new Student() };  
      31.         student[0].setAge(21);  
      32.         student[0].setName("JTZen9");  
      33.         student[0].setSex("male");  
      34.         student[1].setAge(21);  
      35.         student[1].setName("heiheihei");  
      36.         student[1].setSex("female");  
      37.         JSONArray jsonArray3 = new JSONArray();   
      38.         jsonArray3.put(student);  
      39.         System.out.println("注意输出结果:" + jsonArray3);  
      40.   
      41.     }  
      42.   
      43.     public static void main(String[] args) {  
      44.         putMethodTest();  
      45.     }  
      46. }  
      输出的结果如下:


      3.3 JSONStringer.java & JSONWriter.java

              ①JSONWriter可以用来构建一个JSON格式的文本,并转换成String,可以写入文件,便于传输和存储。只有一个构造函数:JSONWriter(java.io.Writer w) 
              ②常用几个函数和说明:
      Java创建和解析Json数据方法(二)——org.json包的使用_第5张图片
              ③JSONStringer是JSONWriter的子类;用法跟JSONWriter几乎一样,区别是可以直接new JSONStringer()创建对象,不用传入构造参数。JSONStringer也可以通过object().key().value().key().value().endObject()进行构造;
              下面是简单的写入代码例子:(可以尝试写入更复杂数据)
      [java] view plain copy
      1. package orgjson;  
      2. import java.io.PrintWriter;  
      3. import java.util.HashMap;  
      4. import java.util.Map;  
      5. import org.json.*;  
      6. public class JSONWriterStringerTest {  
      7.     public static void JSONStringerTest() throws Exception {  
      8.           
      9.         PrintWriter writer = new PrintWriter("test.txt");  
      10.         JSONWriter jsonWriter = new JSONWriter(writer);  
      11.         jsonWriter.object().key("name").value("JTZen9").key("age").value(21).key("sex").value("male").endObject();  
      12.         writer.flush();  
      13.         writer.close();  
      14.           
      15.         Map""> map1 = new HashMap"">();  
      16.         map1.put("age"21);  
      17.         map1.put("sex""male");  
      18.         map1.put("name""jtzen9");  
      19.         Map""> map2 = new HashMap"">();  
      20.         map2.put("age"21);  
      21.         map2.put("sex""female");  
      22.         map2.put("name""heiheihei");  
      23.         JSONStringer jsonStringer = new JSONStringer();  
      24.         jsonStringer.array().value(map1).value(map2).endArray();  
      25.         System.out.println(jsonStringer);  
      26.     }  
      27.   
      28.     public static void main(String[] args) throws Exception {  
      29.         JSONStringerTest();  
      30.     }  
      31. }  
      输出结果,上面为test.txt文件,下面为控制台:
      Java创建和解析Json数据方法(二)——org.json包的使用_第6张图片

      3.4 JSONTokener.java

              JSONTokener读取包含json格式数据的文件,然后可以将JSONTokener对象作为参数来构造JSONObject或JSONArray,然后再进行相应的解析。
      以上面的test.txt为例,简单代码示例如下:
      [java] view plain copy
      1. package orgjson;  
      2. import java.io.File;  
      3. import java.io.FileReader;  
      4. import org.json.*;  
      5. public class JSONTokenerTest {  
      6.       
      7.     public static void readJsonFile() throws Exception{  
      8.         JSONTokener jsonTokener = new JSONTokener(new FileReader(new File("test.txt")));  
      9.         JSONObject jsonObject = new JSONObject(jsonTokener);  
      10.         System.out.println(jsonObject);   
      11.         System.out.println("姓名:" + jsonObject.getString("name"));  
      12.         System.out.println("年龄:" + jsonObject.getInt("age"));  
      13.     }  
      14.   
      15.     public static void main(String[] args) throws Exception {  
      16.         readJsonFile();  
      17.     }  
      18. }  
      输出结果如下:


      4.解析例子

              这里给出一个相对复杂的json数据:
      json.txt
      [java] view plain copy
      1. [  
      2.     {  
      3.         "institute":{  
      4.             "name":"Software Institute",  
      5.             "grade":[  
      6.                 {  
      7.                     "name":"freshman",  
      8.                     "class":[  
      9.                         {  
      10.                             "no.":1,  
      11.                             "students":61  
      12.                         },  
      13.                         {  
      14.                             "no.":2,  
      15.                             "students":62  
      16.                         },  
      17.                         {  
      18.                             "no.":3,  
      19.                             "students":63  
      20.                         }  
      21.                     ]  
      22.                 },  
      23.                 {  
      24.                     "name":"sophomore",  
      25.                     "class":[  
      26.                         {  
      27.                             "no.":1,  
      28.                             "students":51  
      29.                         },  
      30.                         {  
      31.                             "no.":2,  
      32.                             "students":52  
      33.                         },  
      34.                         {  
      35.                             "no.":3,  
      36.                             "students":53  
      37.                         }  
      38.                     ]  
      39.                 },  
      40.                 {  
      41.                     "name":"junior",  
      42.                     "class":[  
      43.                         {  
      44.                             "no.":1,  
      45.                             "students":41  
      46.                         },  
      47.                         {  
      48.                             "no.":2,  
      49.                             "students":42  
      50.                         },  
      51.                         {  
      52.                             "no.":3,  
      53.                             "students":43  
      54.                         }  
      55.                     ]  
      56.                 }  
      57.             ]  
      58.         }  
      59.     }  
      60. ]  
      然后,如果我要获取grade为sophomore的no.等于3的students数量,那么代码如下:
      [java] view plain copy
      1. package orgjson;  
      2. import java.io.File;  
      3. import java.io.FileReader;  
      4. import org.json.JSONArray;  
      5. import org.json.JSONObject;  
      6. import org.json.JSONTokener;  
      7. public class JSONTest {  
      8.     public static void main(String[] args) throws Exception {  
      9.         JSONTokener jsonTokener = new JSONTokener(new FileReader(new File("json.txt")));  
      10.         JSONArray jsonArray = new JSONArray(jsonTokener);//获取整个json文件的内容,因为最外层是数组,所以用JSONArray来构造  
      11.         System.out.println(jsonArray);  
      12.           
      13.         //这个JSONArray数组只包含一个JSONObject对象,标为jsonObject1  
      14.         JSONObject jsonObject1 = jsonArray.getJSONObject(0);  
      15.         System.out.println(jsonObject1);   
      16.           
      17.         //jsonObject1只包含一个institute字段,这里获取这个字段内容赋给jsonObject2  
      18.         JSONObject jsonObject2 = jsonObject1.getJSONObject("institute");  
      19.         System.out.println(jsonObject2);  
      20.           
      21.         //jsonObject2包含name字段和grade字段,grade字段对应的是一个JSONArray数组  
      22.         String valueOfname = jsonObject2.getString("name");  
      23.         System.out.println(valueOfname);  
      24.         JSONArray jsonArray2 = jsonObject2.getJSONArray("grade");  
      25.         System.out.println(jsonArray2);  
      26.           
      27.         //jsonArray2数组包含3个对象,每个对象里面有name字段和class字段,这里获取第二个对象  
      28.         JSONObject jsonObject3 = jsonArray2.getJSONObject(1);  
      29.         System.out.println(jsonObject3);  
      30.           
      31.         //然后从jsonObject3对象里获取class字段对应的JSONArray数组  
      32.         JSONArray jsonArray3 = jsonObject3.getJSONArray("class");  
      33.         System.out.println(jsonArray3);  
      34.           
      35.         //下面直接获取no.等于3的students数量,过程都一样  
      36.         int num = jsonArray3.getJSONObject(2).getInt("students");  
      37.         System.out.println("最后获取的结果为:" + num);  
      38.     }  
      39. }  
      输出的结果如下,这里只截取控制台输出的前半部分结果:
      Java创建和解析Json数据方法(二)——org.json包的使用_第7张图片

      5.结束语

              之前解析json数据都是一直百度百度,别人怎么用就怎么用,做大作业时有时候会org.json包也导入,Gson包也导入,然后各用一点功能。现在想想其实只用一个org.json包就可以完全解决我的需求,只是之前一直没有总结各种用法,所以这两天看了下官网源码,总结了下学习笔记,还是收获蛮大的。
              其实看官网api文档,然后自己动手实践各种方法才是最好的学习方式。百度别人的教程,有时候只能得到小部分的说明。
              org.json包还有很多的api方法并没有用过,所以就不做笔记了。以后用到再继续完善。
      http://blog.csdn.net/zen99t/article/details/50351637

      你可能感兴趣的:(自动化测试,Java,Jmeter)