现在越来越多的网站采用JSON来交换数据,在Json.org网站上,Java可以使用的解析Json的组件就有21种之多。这里以使用org.json解析JSON为例。在读本文之前,读者有必要了解一下JSON的结构,这里不作介绍。
首先下载org.json源码,下载地址:https://github.com/douglascrockford/JSON-java,点 Downloads,Windows系统就选zip吧。下载完后解压,在你的项目里新建一个名为 org.json的包,把除README和Test.java以外的所有文件放入该包内(Eclipse只要拖进去就可以),现在我们就可以用 org.json解析JSON.为了以后方便,你也可以把org.json这个包打成jar,在要用的项目上导入就行。
一、简介
org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类,现在就各个类的使用解释如下。
二、准备
1.在使用org.json之前,我们应该先从该网址https://github.com/douglascrockford/JSON-java下载org.json源码,并将源码其加入到Eclipse中,即可调用。
2.查看相关的API文档,访问:https://github.com/douglascrockford/JSON-java。
三、讲解:
1.JSONObject:
-
是一个无序的键/值对集合。
-
它的表现形式是一个包裹在花括号的字符串,键和值之间使用冒号隔开,键值和键值之间使用逗号隔开。
-
内在形式是一个使用get()和opt()方法通过键来访问值,和使用put()方法通过键来添加或者替代值的对象。
-
值可以是任何这些类型:Boolean,JSONArray,JSONObject,Number和String,或者JOSONObject.NULL对象。
代码演示如下:
1 |
public static void jsonObjectTest() { |
2 |
JSONObject jsonobj = new JSONObject( "{'name':'xiazdong','age':20}" ); |
3 |
String name = jsonobj.getString( "name" ); |
4 |
int age = jsonobj.getInt( "age" ); |
5 |
System.out.println( "name = " + name + ",age = " + age); |
6 |
} |
注:JSONObject有很多optXXX方法,比如optBoolean, optString, optInt...
他们的意思是,如果这个jsonObject有这个属性,则返回这个属性,否则返回一个默认值。
2.JSONArray:
-
是一个有序的序列值。
-
它的表现形式是一个包裹在方括号的字符串,值和值之间使用逗号隔开。
-
内在形式是一个使用get()和opt()方法通过索引来访问值,和使用put()方法来添加或修改值的对象。
-
值可以是任何这些类型:Boolean,JSONArray,JSONObject,Number,和String,或者JSONObject.NULL对象。
代码演示如下:
1 |
public static void jsonArrayTest() { |
2 |
JSONArray jsonarray = new JSONArray( "[{'name':'xiazdong','age':20},{'name':'xzdong','age':15}]" ); |
3 |
for ( int i = 0 ; i < jsonarray.length(); i++) { |
4 |
JSONObject jsonobj = jsonarray.getJSONObject(i); |
5 |
String name = jsonobj.getString( "name" ); |
6 |
int age = jsonobj.getInt( "age" ); |
7 |
System.out.println( "name = " + name + ",age = " + age); |
8 |
} |
9 |
} |
嵌套的JSONObject和JSONArray代码演示如下:
01 |
public static void jsonObjectAndArrayTest() { |
02 |
String jsonstring = "{'name':'xiazdong','age':20,'book':['book1','book2']}" ; |
03 |
JSONObject jsonobj = new JSONObject(jsonstring); |
04 |
|
05 |
String name = jsonobj.getString( "name" ); |
06 |
System.out.println( "name" + ":" + name); |
07 |
|
08 |
int age = jsonobj.getInt( "age" ); |
09 |
System.out.println( "age" + ":" + age); |
10 |
|
11 |
JSONArray jsonarray = jsonobj.getJSONArray( "book" ); |
12 |
for ( int i = 0 ; i < jsonarray.length(); i++) { |
13 |
String book = jsonarray.getString(i); |
14 |
System.out.println( "book" + i + ":" + book); |
15 |
} |
16 |
} <span style= "line-height:17px;background-color:transparent;font-family:Calibri, sans-serif;color:windowtext;font-size:11pt;" > </span> |
3.JSONStringer:
-
是一个用于快速构造JSON文本的工具
-
JSONWriter的子类
-
bject():开始一个对象,即添加{;enObject():结束一个对象,即添加}
-
array():开始一个数组,即添加[; endArray():结束一个数组,即添加]
-
key():表示添加一个key;value():表示添加一个value
代码演示如下:
1 |
public static void jsonStringerTest() { |
2 |
JSONStringer stringer = new JSONStringer(); |
3 |
stringer.object().key( "name" ).value( "xiazdong" ).key( "age" ).value( 20 ).endObject(); |
4 |
System.out.println(stringer); |
5 |
} <span style= "line-height:17px;background-color:transparent;font-family:Calibri, sans-serif;color:windowtext;font-size:11pt;" > </span> |
负载的JSON格式写演示(PrintWriter+JSONStringer可以写入JSON文件):
01 |
public static void jsonStringerTest2() throws FileNotFoundException { |
02 |
JSONStringer jsonStringer = new JSONStringer(); |
03 |
JSONObject obj6 = new JSONObject(); |
04 |
obj6.put( "title" , "book1" ).put( "price" , "$11" ); |
05 |
JSONObject obj3 = new JSONObject(); |
06 |
obj3.put( "book" , obj6); |
07 |
obj3.put( "author" , new JSONObject().put( "name" , "author-1" )); |
08 |
|
09 |
JSONObject obj5 = new JSONObject(); |
10 |
obj5.put( "title" , "book2" ).put( "price" , "$22" ); |
11 |
JSONObject obj4 = new JSONObject(); |
12 |
obj4.put( "book" , obj5); |
13 |
obj4.put( "author" , new JSONObject().put( "name" , "author-2" )); |
14 |
|
15 |
JSONArray obj2 = new JSONArray(); |
16 |
obj2.put(obj3).put(obj4); |
17 |
|
18 |
JSONObject obj1 = new JSONObject(); |
19 |
obj1.put( "title" , "BOOK" ); |
20 |
obj1.put( "signing" , obj2); |
21 |
|
22 |
jsonStringer.object().key( "session" ).value(obj1).endObject(); |
23 |
System.out.println(jsonStringer.toString()); |
24 |
|
25 |
PrintWriter out = new PrintWriter( new FileOutputStream( "1.txt" )); |
26 |
out.println(jsonStringer.toString()); |
27 |
out.close(); |
28 |
} <span style= "line-height:17px;background-color:transparent;font-family:Calibri, sans-serif;color:windowtext;font-size:11pt;" > </span> |
4.JSONTokener
-
它和JSONObject和JSONArray的构造函数一起使用,用于解析JSON源字符串
代码演示如下(JSONObject+JSONTokener能够获取JSON格式文本对象):
1 |
public static void JSONTokenerTest() throws FileNotFoundException { |
2 |
JSONObject jsonobj = new JSONObject( new JSONTokener( new FileReader( new File( "1.txt" )))); |
3 |
System.out.println(jsonobj.getJSONObject( "session" ).getJSONArray( "signing" ).getJSONObject( 1 ).getJSONObject( "book" ).getString( "title" )); |
4 |
} |
注意:在Java中,JSON格式的字符串最好用单引号表示
例子一:
例子二:
//使用new JSONObject()构造一个JSON对象,参数为空
public
String jsonTest()
throws
JSONException{
JSONObject json=
new
JSONObject();
JSONArray jsonMembers =
new
JSONArray();
JSONObject member1 =
new
JSONObject();
member1.put(
"loginname"
,
"jack"
);
member1.put(
"password"
,
"userpass"
);
member1.put(
"sign_date"
,
"2007-06-12"
);
jsonMembers.put(member1);
JSONObject member2 =
new
JSONObject();
member2.put(
"loginname"
,
"tom"
);
member2.put(
"password"
,
"userpass"
);
member2.put(
"sign_date"
,
"2008-07-16"
);
jsonMembers.put(member2);
json.put(
"users"
, jsonMembers);
//以字符串形式返回JSON对象的内容
return
json.toString();
}
//从字符串构造一个JSON对象并解析之
public
String jsonTest2()
throws
JSONException{
String jsonString=
"{\"users\":[{\"loginname\":\"jack\",\"password\":\"userpass\",\"email\":\"[email protected]\"},{\"loginname\":\"tom\",\"password\":\"userpass\",\"email\":\"[email protected]\"}]}"
;
JSONObject json=
new
JSONObject(jsonString);
JSONArray jsonArray=json.getJSONArray(
"users"
);
String loginNames=
"loginname list:"
;
for
(
int
i=
0
;i<jsonArray.length();i++){
JSONObject user=(JSONObject) jsonArray.get(i);
String userName=(String) user.get(
"loginname"
);
if
(i==jsonArray.length()-
1
){
loginNames+=userName;
}
else
{
loginNames+=userName+
","
;
}
}
return
loginNames;
}