• 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方法并没有用过,所以就不做笔记了。以后用到再继续完善。
  • 相关阅读:
    132123
    (一)robotframework自动化环境搭建
    python读取xlsx、csv、txt、html文件
    (二)robotframework自动化中遇到的错误及解决思路
    python使用小技巧
    三生零基础大白菜自动重装系统教程
    安装JDK和配置环境变量
    webpack 一套工程代码 管理多个相似项目
    box2dWeb 学习笔记
    简单计时器
  • 原文地址:https://www.cnblogs.com/geek1116/p/7413619.html
Copyright © 2020-2023  润新知