Simple JSON是Google开发的Java JSON解析框架,基于Apache协议。
下载的文件是:json_simple.jar
例子1:很方便的方式,使用JSONValue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
System.out.println( "=======decode=======" );
String s= "[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]" ;
Object obj=JSONValue.parse(s);
JSONArray array=(JSONArray)obj;
System.out.println( "======the 2nd element of array======" );
System.out.println(array.get( 1 ));
System.out.println();
JSONObject obj2=(JSONObject)array.get( 1 );
System.out.println( "======field \"1\"==========" );
System.out.println(obj2.get( "1" ));
s= "{}" ;
obj=JSONValue.parse(s);
System.out.println(obj);
s= "[5,]" ;
obj=JSONValue.parse(s);
System.out.println(obj);
s= "[5,,2]" ;
obj=JSONValue.parse(s);
System.out.println(obj);
|
JSONObject是继承Map的,而JSONArray是继承List的,所以你可以用Map和List的标准方式来使用JSONObject和JSONArray。
而JSONValue则可以使用数组也可以用对象。
例子2:快速的方式,使用JSONParser
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
JSONParser parser= new JSONParser();
System.out.println( "=======decode=======" );
String s= "[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]" ;
Object obj=parser.parse(s);
JSONArray array=(JSONArray)obj;
System.out.println( "======the 2nd element of array======" );
System.out.println(array.get( 1 ));
System.out.println();
JSONObject obj2=(JSONObject)array.get( 1 );
System.out.println( "======field \"1\"==========" );
System.out.println(obj2.get( "1" ));
s= "{}" ;
obj=parser.parse(s);
System.out.println(obj);
s= "[5,]" ;
obj=parser.parse(s);
System.out.println(obj);
s= "[5,,2]" ;
obj=parser.parse(s);
System.out.println(obj);
|
使用JSONParser需要捕获异常。
例子3:异常处理
1
2
3
4
5
6
7
8
9
10
|
String jsonText = "[[null, 123.45, \"a\\tb c\"]}, true" ;
JSONParser parser = new JSONParser();
try {
parser.parse(jsonText);
}
catch (ParseException pe){
System.out.println( "position: " + pe.getPosition());
System.out.println(pe);
}
|
执行结果:
1
|
position: 25 Unexpected token RIGHT BRACE(}) at position 25 .
|
例子4:容器工厂
使用使用ContainerFactory类来创建一个容器工厂。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
String jsonText = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789}" ;
JSONParser parser = new JSONParser();
ContainerFactory containerFactory = new ContainerFactory(){
public List creatArrayContainer() {
return new LinkedList();
}
public Map createObjectContainer() {
return new LinkedHashMap();
}
};
try {
Map json = (Map)parser.parse(jsonText, containerFactory);
Iterator iter = json.entrySet().iterator();
System.out.println( "==iterate result==" );
while (iter.hasNext()){
Map.Entry entry = (Map.Entry)iter.next();
System.out.println(entry.getKey() + "=>" + entry.getValue());
}
System.out.println( "==toJSONString()==" );
System.out.println(JSONValue.toJSONString(json));
}
catch (ParseException pe){
System.out.println(pe);
}
|
结果如下:
1
2
|
==iterate result== first=> 123 second=>[ 4 , 5 , 6 ] third=> 789 ==toJSONString()==
{ "first" : 123 , "second" :[ 4 , 5 , 6 ], "third" : 789 }
|
如果你不使用容器工厂,Simple-JSON默认使用JSONObject和JSONArray。
例子5:可停的SAX式内容处理
SimpleJSON推荐一种简单的可停的SAX方式的内容处理方式来处理文本流,用户可以停留在逻辑输入流的任意点,接着去处理其他逻辑,然后再继续先前的处理。不用等待整个流处理完毕。以下是一个例子。
KeyFinder.java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
class KeyFinder implements ContentHandler{
private Object value;
private boolean found = false ;
private boolean end = false ;
private String key;
private String matchKey;
public void setMatchKey(String matchKey){
this .matchKey = matchKey;
}
public Object getValue(){
return value;
}
public boolean isEnd(){
return end;
}
public void setFound( boolean found){
this .found = found;
}
public boolean isFound(){
return found;
}
public void startJSON() throws ParseException, IOException {
found = false ;
end = false ;
}
public void endJSON() throws ParseException, IOException {
end = true ;
}
public boolean primitive(Object value) throws ParseException, IOException {
if (key != null ){
if (key.equals(matchKey)){
found = true ;
this .value = value;
key = null ;
return false ;
}
}
return true ;
}
public boolean startArray() throws ParseException, IOException {
return true ;
}
public boolean startObject() throws ParseException, IOException {
return true ;
}
public boolean startObjectEntry(String key) throws ParseException, IOException {
this .key = key;
return true ;
}
public boolean endArray() throws ParseException, IOException {
return false ;
}
public boolean endObject() throws ParseException, IOException {
return true ;
}
public boolean endObjectEntry() throws ParseException, IOException {
return true ;
}
}
|
Main logic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
String jsonText = "{\"first\": 123, \"second\": [{\"k1\":{\"id\":\"id1\"}}, 4, 5, 6, {\"id\": 123}], \"third\": 789, \"id\": null}" ;
JSONParser parser =newJSONParser();
KeyFinder finder =newKeyFinder();
finder.setMatchKey( "id" );
try {
while (!finder.isEnd()){
parser.parse(jsonText, finder, true );
if (finder.isFound()){
finder.setFound( false );
System.out.println( "found id:" );
System.out.println(finder.getValue());
}
}
}
catch (ParseException pe){
pe.printStackTrace();
}
|
执行结果:
1
2
3
4
5
6
|
found id:
id1
found id:
123
found id:
null
|
例子6:整个对象图,用SAX式的解析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
class Transformer implements ContentHandler{
private Stack valueStack;
public Object getResult(){
if (valueStack == null || valueStack.size() == 0 )
return null ;
return valueStack.peek();
}
public boolean endArray () throws ParseException, IOException {
trackBack();
return true ;
}
public void endJSON () throws ParseException, IOException {}
public boolean endObject () throws ParseException, IOException {
trackBack();
return true ;
}
public boolean endObjectEntry () throws ParseException, IOException {
Object value = valueStack.pop();
Object key = valueStack.pop();
Map parent = (Map)valueStack.peek();
parent.put(key, value);
return true ;
}
private void trackBack(){
if (valueStack.size() > 1 ){
Object value = valueStack.pop();
Object prev = valueStack.peek();
if (prev instanceof String){
valueStack.push(value);
}
}
}
private void consumeValue(Object value){
if (valueStack.size() == 0 )
valueStack.push(value);
else {
Object prev = valueStack.peek();
if (prev instanceof List){
List array = (List)prev;
array.add(value);
}
else {
valueStack.push(value);
}
}
}
public boolean primitive (Object value) throws ParseException, IOException {
consumeValue(value);
return true ;
}
public boolean startArray () throws ParseException, IOException {
List array = new JSONArray();
consumeValue(array);
valueStack.push(array);
return true ;
}
public void startJSON () throws ParseException, IOException {
valueStack = new Stack();
}
public boolean startObject () throws ParseException, IOException {
Map object = new JSONObject();
consumeValue(object);
valueStack.push(object);
return true ;
}
public boolean startObjectEntry (String key) throws ParseException, IOException {
valueStack.push(key);
return true ;
}
}
|
Main方式逻辑:
1
2
3
4
5
6
7
|
String jsonString = <Input JSON text>;
Object value = null ;
JSONParser parser = new JSONParser();
Transformer transformer = new Transformer();
parser.parse(jsonString, transformer);
value = transformer.getResult();
|
执行结果:
1
2
3
4
|
String jsonString =<Input JSON text>;
Object value = null ;
JSONParser parser =newJSONParser();
value = parser.parse(jsonString);
|
注意:
JSONPauser不是线程安全的。
json_encode — 对变量进行 JSON 编码。
说明:string json_encode ($value ),返回 value 值的 JSON 形式。
参数:待编码的 value ,除了resource 类型之外,可以为任何数据类型
该函数只能接受 UTF-8 编码的数据(译注:指字符/字符串类型的数据)
返回值:编码成功则返回一个以 JSON 形式表示的 string 。