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数据等。
      

2.常用类

    
 

3.构造json的示例用法

3.1 JSONObject.java

        官网给出的JSONObject的构造函数如下:
        比较常用就是传入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<string object> map = new HashMap<string object>();  
  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<object> list = new ArrayList</object><object>();  
  38.         for (int i = 1; i < 3; i++) {  
  39.             Map<string object=""> map = new HashMap<string object="">();  
  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. }  
输出结果:
 

3.2 JSONArray.java

1.构造函数

        官网上的JSONObject的构造函数如下:
        这里用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<Object> list = new ArrayList<Object>();  
  15.         for (int i = 1; i < 3; i++) {  
  16.             Map<string object=""> map = new HashMap<string object="">();  
  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. }  
        输出结果如下:

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<string object=""> map = new HashMap<string object="">();  
  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) 
        ②常用几个函数和说明:
        ③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<string object=""> map1 = new HashMap<string object="">();  
  16.         map1.put("age", 21);  
  17.         map1.put("sex", "male");  
  18.         map1.put("name", "jtzen9");  
  19.         Map<string object=""> map2 = new HashMap<string object="">();  
  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文件,下面为控制台:
 

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. }  
输出的结果如下,这里只截取控制台输出的前半部分结果:
 

5.结束语

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