(二)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. 【15】ES6 for Humans: The Latest Standard of JavaScript: ES2015 and Beyond

    [15]ES6 for Humans 共148页: 目前看到:已经全部阅读.   亚马逊地址: 魔芋:总结: 我先看的是阮一峰的在线书籍.这本书的内容很多都与之重复的. 居然卖¥463.也是没谁了. ...

  2. Objective-C中的一些特殊的数据类型

    nil nil和C语言的NULL相同,在objc/objc.h中定义.nil表示一个Objctive-C对象,这个对象的指针指向空(没有东西就是空). Nil  首字母大写的Nil和nil有一点不一样 ...

  3. HTML5之中国象棋,附带源码!

    好久没写随笔了,好怀恋2013年的日子,因为现在不能回到过去了! 再见了 感谢你为我做的一切! 进入正题:HTML5之中国象棋 很小就会下象棋了,  这是象棋的测试地址:点击我吧   然后点击里面的象 ...

  4. bat 中的特殊符号输出问题

    系统关键字(感叹号!)冲突 由于是自动化部署,因此需要使用到循环,这里就不可避免的用到了延迟变量(setlocal enabledelayedexpansion) 有关延迟变量的知识,大家可以通过这篇 ...

  5. TOJ4537: n阶行列式

    4537: n阶行列式  Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByteTotal Submit: 28       ...

  6. IO Streams:字节流

    简介 程序使用字节流来执行8位字节的输入和输出.所有字节流类都继承于InputStream和OutputStream. 有很多字节流类:为了说明字节流如何工作,我们将重点关注文件I / O字节流Fil ...

  7. git命令综合

    Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势.Git常用操作命令:1) 远程仓库相关命令检出仓库:$ git clone git: ...

  8. JavaScriptCore 简介

    转自http://esoftmobile.com/2013/06/19/integrating-javascript-into-native-applications/ Integrating Jav ...

  9. 【bzoj2563】阿狸和桃子的游戏 贪心

    题目描述 阿狸和桃子正在玩一个游戏,游戏是在一个带权图G=(V, E)上进行的,设节点权值为w(v),边权为c(e).游戏规则是这样的:1. 阿狸和桃子轮流将图中的顶点染色,阿狸会将顶点染成红色,桃子 ...

  10. NOJ——聊天止于呵呵(string流重定向+map,水题)

    [1645] 聊天止于呵呵 时间限制: 5000 ms 内存限制: 65535 K 问题描述 (现代版)俗话说:流言止于智者,聊天止于呵呵.输入一段聊天记录,你的任务是数一数有 多少段对话“止于呵呵” ...