(二)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.常用类

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

3.构造json的示例用法

3.1 JSONObject.java

        官网给出的JSONObject的构造函数如下:
        比较常用就是传入String、map或者bean来构造JSON对象,代码例子如下:
首先定义一个java bean类:
 package orgjson;

 /**
  * 包含getter和setter的java bean类
  * @author Zen9
  */
 public class Student {
     private String name;
     private String sex;
     private int age;

     public String getName() {
         return name;
     }
     public void setName(String name) {
         this.name = name;
     }
     public String getSex() {
         return sex;
     }
     public void setSex(String sex) {
         this.sex = sex;
     }
     public int getAge() {
         return age;
     }
     public void setAge(int age) {
         this.age = age;
     }
 }
然后测试构造方法;也可以用put方法来向JSON对象中添加key/value对,当用put方法时候,value值可以是int、double、String、、boolean、collection、Map等等,但不可以为bean类型,代码如下:
 package orgjson;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.json.*;
 public class JsonTest {
     public static void constructorTest() {

         String jsonStr = "{'name':'JTZen9','age':21}";
         JSONObject strJson = new JSONObject(jsonStr); // 传入字符串
         System.out.println("构造参数为String类:" + strJson);

         Map<string object> map = new HashMap<string object>();
         map.put("age", 21);
         map.put("sex", "male");
         map.put("name", "JTZen9");
         JSONObject mapJson = new JSONObject(map); // 传入Map类型
         System.out.println("构造参数为Map类:" + mapJson);

         Student student = new Student();
         student.setAge(21);
         student.setName("JTZen9");
         student.setSex("male");
         JSONObject beanJson = new JSONObject(student); // 传入Bean类型
         System.out.println("构造参数为Bean类:" + beanJson);
     }

     public static void putMethodTest() {

         JSONObject jsonObject1 = new JSONObject();
         jsonObject1.put("bookName", "JTZen9");
         jsonObject1.put("age", 21);
         System.out.println(jsonObject1);

         JSONObject jsonObject2 = new JSONObject();
         List<object> list = new ArrayList</object><object>();
         for (int i = 1; i < 3; i++) {
             Map<string object=""> map = new HashMap<string object="">();
             map.put("title", "java程序设计 第" + i + "版");
             map.put("price", i*20);
             list.add(map);
         }
         jsonObject2.put("book", list);
         System.out.println(jsonObject2);

         Student student = new Student();
         student.setAge(21);
         student.setName("JTZen9");
         student.setSex("male");
         jsonObject2 = new JSONObject(student);
         JSONObject jsonObject3 = new JSONObject();
         jsonObject3.put("people", jsonObject2);   //不可以直接传bean类对象put("people",student)
         System.out.println(jsonObject3);
     }

     public static void main(String[] args) throws Exception {
         constructorTest();
         System.out.println("---------------------------------------------------------");
         putMethodTest();
     }
 }
输出结果:
 

3.2 JSONArray.java

1.构造函数

官网上的JSONObject的构造函数如下:

        这里用Collection、String和Object型的array作为参数,给出例子如下:
 package orgjson;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.json.*;
 public class JsonArrayTest {
     public static void constructorTest() {

         String jsonStr = "[{'name':'JTZen9','age':21}]";
         JSONArray strJson = new JSONArray(jsonStr);     // 传入字符串
         System.out.println("构造参数为String类:" + strJson);

         List<Object> list = new ArrayList<Object>();
         for (int i = 1; i < 3; i++) {
             Map<string object=""> map = new HashMap<string object="">();
             map.put("title", "java程序设计 第" + i + "版");
             map.put("price", i*20);
             list.add(map);
         }
         JSONArray mapJson = new JSONArray(list);         // 传入Collection类型
         System.out.println("构造参数为Collection类:" + mapJson);

         int[] numlist = new int[10];
         for (int i = 0; i < numlist.length; i++) {
             numlist[i] = i;
         }
         JSONArray arrayJson = new JSONArray(numlist);     // 传入Array类型,实例1
         System.out.println(arrayJson);

         Student[] student = {new Student(),new Student()};
         student[0].setAge(21);
         student[0].setName("JTZen9");
         student[0].setSex("male");
         student[1].setAge(21);
         student[1].setName("heiheihei");
         student[1].setSex("female");
         JSONArray beanJson = new JSONArray(student);     // 传入Array类型,实例2
         System.out.println("构造参数为Array类:" + beanJson);
     }

     public static void main(String[] args) {
         constructorTest();
     }
 }
        输出结果如下:

2.put方法创建

put方法中可以直接将int、double、Collection、Map等加进去,也可以添加下标来指定添加的位置:put(int index, java.util.Map value) ,使用put方法构造的JSON数组,如果传入的是数组,都会自动加一对中括号[ ],那么出来的结果就会有两层的中括号[ ],代码例子如下:

 package orgjson;
 import java.util.HashMap;
 import java.util.Map;
 import org.json.*;
 public class JSONArrayTest {
     public static void putMethodTest() {
         JSONArray jsonArray1 = new JSONArray();
         jsonArray1.put("JTZen9");
         jsonArray1.put(21);
         jsonArray1.put("male");
         System.out.println(jsonArray1);

         JSONArray jsonArray2 = new JSONArray();
         Map<string object=""> map = new HashMap<string object="">();
         map.put("title", "java程序设计 第2版");
         map.put("price", 20);
         jsonArray2.put(map);        //传入一个map
         System.out.println("传入一个Map:" + jsonArray2);
         map.clear();
         map.put("title", "java程序设计 第3版");
         map.put("price", 30);
         jsonArray2.put(map);        //没有下标的直接在结果后面添加
         System.out.println("没有指定下标:" + jsonArray2);
         map.clear();
         map.put("title", "java程序设计 第1版");
         map.put("price", 10);
         jsonArray2.put(0,map);        //使用下标可以添加到自定义的位置
         System.out.println("添加到第一个位置:" + jsonArray2);

         Student[] student = { new Student(), new Student() };
         student[0].setAge(21);
         student[0].setName("JTZen9");
         student[0].setSex("male");
         student[1].setAge(21);
         student[1].setName("heiheihei");
         student[1].setSex("female");
         JSONArray jsonArray3 = new JSONArray();
         jsonArray3.put(student);
         System.out.println("注意输出结果:" + jsonArray3);

     }

     public static void main(String[] args) {
         putMethodTest();
     }
 }
输出的结果如下:
 

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()进行构造;
        下面是简单的写入代码例子:(可以尝试写入更复杂数据)
 package orgjson;
 import java.io.PrintWriter;
 import java.util.HashMap;
 import java.util.Map;
 import org.json.*;
 public class JSONWriterStringerTest {
     public static void JSONStringerTest() throws Exception {

         PrintWriter writer = new PrintWriter("test.txt");
         JSONWriter jsonWriter = new JSONWriter(writer);
         jsonWriter.object().key("name").value("JTZen9").key("age").value(21).key("sex").value("male").endObject();
         writer.flush();
         writer.close();

         Map<string object=""> map1 = new HashMap<string object="">();
         map1.put("age", 21);
         map1.put("sex", "male");
         map1.put("name", "jtzen9");
         Map<string object=""> map2 = new HashMap<string object="">();
         map2.put("age", 21);
         map2.put("sex", "female");
         map2.put("name", "heiheihei");
         JSONStringer jsonStringer = new JSONStringer();
         jsonStringer.array().value(map1).value(map2).endArray();
         System.out.println(jsonStringer);
     }

     public static void main(String[] args) throws Exception {
         JSONStringerTest();
     }
 }
输出结果,上面为test.txt文件,下面为控制台:
 

3.4 JSONTokener.java

        JSONTokener读取包含json格式数据的文件,然后可以将JSONTokener对象作为参数来构造JSONObject或JSONArray,然后再进行相应的解析。
以上面的test.txt为例,简单代码示例如下:
 package orgjson;
 import java.io.File;
 import java.io.FileReader;
 import org.json.*;
 public class JSONTokenerTest {

     public static void readJsonFile() throws Exception{
         JSONTokener jsonTokener = new JSONTokener(new FileReader(new File("test.txt")));
         JSONObject jsonObject = new JSONObject(jsonTokener);
         System.out.println(jsonObject);
         System.out.println("姓名:" + jsonObject.getString("name"));
         System.out.println("年龄:" + jsonObject.getInt("age"));
     }

     public static void main(String[] args) throws Exception {
         readJsonFile();
     }
 }
输出结果如下:
 

4.解析例子

        这里给出一个相对复杂的json数据:
json.txt
 [
     {
         "institute":{
             "name":"Software Institute",
             "grade":[
                 {
                     "name":"freshman",
                     "class":[
                         {
                             "no.":1,
                             "students":61
                         },
                         {
                             "no.":2,
                             "students":62
                         },
                         {
                             "no.":3,
                             "students":63
                         }
                     ]
                 },
                 {
                     "name":"sophomore",
                     "class":[
                         {
                             "no.":1,
                             "students":51
                         },
                         {
                             "no.":2,
                             "students":52
                         },
                         {
                             "no.":3,
                             "students":53
                         }
                     ]
                 },
                 {
                     "name":"junior",
                     "class":[
                         {
                             "no.":1,
                             "students":41
                         },
                         {
                             "no.":2,
                             "students":42
                         },
                         {
                             "no.":3,
                             "students":43
                         }
                     ]
                 }
             ]
         }
     }
 ]
然后,如果我要获取grade为sophomore的no.等于3的students数量,那么代码如下:
 package orgjson;
 import java.io.File;
 import java.io.FileReader;
 import org.json.JSONArray;
 import org.json.JSONObject;
 import org.json.JSONTokener;
 public class JSONTest {
     public static void main(String[] args) throws Exception {
         JSONTokener jsonTokener = new JSONTokener(new FileReader(new File("json.txt")));
         JSONArray jsonArray = new JSONArray(jsonTokener);//获取整个json文件的内容,因为最外层是数组,所以用JSONArray来构造
         System.out.println(jsonArray);

         //这个JSONArray数组只包含一个JSONObject对象,标为jsonObject1
         JSONObject jsonObject1 = jsonArray.getJSONObject(0);
         System.out.println(jsonObject1); 

         //jsonObject1只包含一个institute字段,这里获取这个字段内容赋给jsonObject2
         JSONObject jsonObject2 = jsonObject1.getJSONObject("institute");
         System.out.println(jsonObject2);

         //jsonObject2包含name字段和grade字段,grade字段对应的是一个JSONArray数组
         String valueOfname = jsonObject2.getString("name");
         System.out.println(valueOfname);
         JSONArray jsonArray2 = jsonObject2.getJSONArray("grade");
         System.out.println(jsonArray2);

         //jsonArray2数组包含3个对象,每个对象里面有name字段和class字段,这里获取第二个对象
         JSONObject jsonObject3 = jsonArray2.getJSONObject(1);
         System.out.println(jsonObject3);

         //然后从jsonObject3对象里获取class字段对应的JSONArray数组
         JSONArray jsonArray3 = jsonObject3.getJSONArray("class");
         System.out.println(jsonArray3);

         //下面直接获取no.等于3的students数量,过程都一样
         int num = jsonArray3.getJSONObject(2).getInt("students");
         System.out.println("最后获取的结果为:" + num);
     }
 }
输出的结果如下,这里只截取控制台输出的前半部分结果:
 

5.结束语

之前解析json数据都是一直百度百度,别人怎么用就怎么用,做大作业时有时候会org.json包也导入,Gson包也导入,然后各用一点功能。现在想想其实只用一个org.json包就可以完全解决我的需求,只是之前一直没有总结各种用法,所以这两天看了下官网源码,总结了下学习笔记,还是收获蛮大的。

        其实看官网api文档,然后自己动手实践各种方法才是最好的学习方式。百度别人的教程,有时候只能得到小部分的说明。
        org.json包还有很多的api方法并没有用过,所以就不做笔记了。以后用到再继续完善。

Java创建和解析Json数据方法(二)——org.json包的使用的更多相关文章

  1. Java创建和解析Json数据方法(四)——json-lib包的使用

    (四)json-lib包的使用         既然json-lib包比org.json包重量级,那么json-lib包肯定有很多org.json包没有的类和方法,这篇笔记简单记录json-lib包中 ...

  2. Java创建和解析Json数据方法(五)——Google Gson包的使用

    (五)Google Gson包的使用 1.简介 Gson包中,使用最多的是Gson类的toJson()和fromJson()方法:         ①toJson():将java对象转化为json数据 ...

  3. Java学习-029-JSON 之三 -- 模仿 cssSelector 封装读取 JSON 数据方法

    前文简单介绍了如何通过 json-20141113.jar 提供的功能获取 JSON 的数据,敬请参阅:Java学习-028-JSON 之二 -- 数据读取. 了解学习过 JQuery 的朋友都知道, ...

  4. Golang: 解析JSON数据之二

    上次我们介绍了 Go 语言中序列化和反序列化 JSON 数据的两个方法 Marshal() 和 Unmarshal(),并以示例演示了它们的用法. 我们在例子中看到,需要事先声明好对应的结构体,才能跟 ...

  5. js进阶ajax读取json数据(ajax读取json和读取普通文本,和获取服务器返回数据(链接)都是一样的,在url处放上json文件的地址即可)

    js进阶ajax读取json数据(ajax读取json和读取普通文本,和获取服务器返回数据(链接)都是一样的,在url处放上json文件的地址即可) 一.总结 ajax读取json和读取普通文本,和获 ...

  6. js中json数据简单处理(JSON.parse()和js中嵌套html)

    js中json数据简单处理(JSON.parse()和js中嵌套html) 一.总结 1.html中嵌套js:<script>js代码</script> 2.js中嵌套html ...

  7. 将String类型的json数据转换为真正的json数据

    问题 在做JavaWeb项目的时候,我们经常需要将Java对象转化为Json数据格式响应到前台页面,但是转化完成之后,看着是Json类型的数据格式,但实际上是字符串类型,在这里说两个方法将String ...

  8. Java创建和解析Json数据方法(三)——json-lib包的使用

    (三)json-lib包的使用         这篇笔记主要介绍json-lib包的创建和解析json数据的方式,主要是的JSONObject.JSONArray和Java对象:beans, maps ...

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

    org.json包的使用 1.简介   工具包org.json.jar,是一个轻量级的,JAVA下的json构造和解析工具包,它还包含JSON与XML, HTTP headers, Cookies, ...

随机推荐

  1. 杭电 1155 Bungee Jumping(物理题)

    Problem Description Once again, James Bond is fleeing from some evil people who want to see him dead ...

  2. Tourists Gym - 101002I LCA——dfs+RMQ在线算法

    LCA(Least Common Ancestors),即最近公共祖先,是指这样一个问题:在有根树中,找出某两个结点u和v最近的公共祖先(另一种说法,离树根最远的公共祖先). 知识需求:1)RMQ的S ...

  3. 通过Proxool配置访问数据库的要点

    proxool 配置的时候有Proxool.properties 或者 Proxool.xml 两种方式初始化. 我的配置环境是 myEclipse10+tomcat6.0 + mysql5.0 . ...

  4. Sonar - 部署常见问题及解决方法

    1. sonarqube启动报错,查看es.log如下: 问题原因:sonarqube不能使用root用户启动 解决方法: (1)更改sonarqube所属用户权限 chown -R gold:gol ...

  5. jmeter返回的Unicode转换成utf8

    该问题通过查找资料借鉴前辈门的经验得到了解决,记录下来是为了后面能够用到 最近发现有些接口返回的时unicode类型的,如下图所示: 因此只需要在jmeter中添加后置处理器:BeanShell Po ...

  6. python week08 并发编程之多线程--实践部分

    一. threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.pytho ...

  7. sgen.exe 未能运行

    指定的任务可执行文件“sgen.exe”未能运行.文件名或扩展名太长. 解决方式,右键项目属性->生成  把下图红框的“开”设置成“自动”

  8. kb-07线段树--11--区间多重该值多种查询

    /* lazy思想的运用,因为查询多种,如果全记录就太繁了,lazy就是如果该区间的每一个叶子的状态都相同就不用深入下去该值,只要暂时标记下,查询的时候也不用下去,直接计算: */ #include& ...

  9. 将selenium集成到scrapy框架中

    一 首先想到的是将selenium 写在下载中间件的process_request中.如以下代码. middleware.py from selenium import webdriver from ...

  10. java8 函数式接口——Function/Predict/Supplier/Consumer

    Function 我们知道Java8的最大特性就是函数式接口.所有标注了@FunctionalInterface注解的接口都是函数式接口,具体来说,所有标注了该注解的接口都将能用在lambda表达式上 ...