(二)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类:
[java]
view plain
copy
package orgjson;
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类型,代码如下:
[java]
view plain
copy
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); System.out.println(
"构造参数为Map类:" + mapJson); Student student =
new Student(); student.setAge(
21); student.setName(
"JTZen9"); student.setSex(
"male"); JSONObject beanJson =
new JSONObject(student); 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); 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作为参数,给出例子如下:
[java]
view plain
copy
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); 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); 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); 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数组,如果传入的是数组,都会自动加一对中括号[ ],那么出来的结果就会有两层的中括号[ ],代码例子如下:
[java]
view plain
copy
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); 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()进行构造;
下面是简单的写入代码例子:(可以尝试写入更复杂数据)
[java]
view plain
copy
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为例,简单代码示例如下:
[java]
view plain
copy
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
[java]
view plain
copy
[ {
"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数量,那么代码如下:
[java]
view plain
copy
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); System.out.println(jsonArray); JSONObject jsonObject1 = jsonArray.getJSONObject(
0); System.out.println(jsonObject1); JSONObject jsonObject2 = jsonObject1.getJSONObject(
"institute"); System.out.println(jsonObject2); String valueOfname = jsonObject2.getString(
"name"); System.out.println(valueOfname); JSONArray jsonArray2 = jsonObject2.getJSONArray(
"grade"); System.out.println(jsonArray2); JSONObject jsonObject3 = jsonArray2.getJSONObject(
1); System.out.println(jsonObject3); JSONArray jsonArray3 = jsonObject3.getJSONArray(
"class"); System.out.println(jsonArray3);
int num = jsonArray3.getJSONObject(
2).getInt(
"students"); System.out.println(
"最后获取的结果为:" + num); } }
输出的结果如下,这里只截取控制台输出的前半部分结果:
5.结束语
之前解析json数据都是一直百度百度,别人怎么用就怎么用,做大作业时有时候会org.json包也导入,Gson包也导入,然后各用一点功能。现在想想其实只用一个org.json包就可以完全解决我的需求,只是之前一直没有总结各种用法,所以这两天看了下官网源码,总结了下学习笔记,还是收获蛮大的。
其实看官网api文档,然后自己动手实践各种方法才是最好的学习方式。百度别人的教程,有时候只能得到小部分的说明。
org.json包还有很多的api方法并没有用过,所以就不做笔记了。以后用到再继续完善。
http://blog.csdn.net/zen99t/article/details/50351637