结果如下:
1
2
|
==iterate result== first=> 123 second=>[ 4 , 5 , 6 ] third=> 789 ==toJSONString()== { "first" : 123 , "second" :[ 4 , 5 , 6 ], "third" : 789 } |
服务器之家 > 正文
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 } |
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 ; } } |
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 |
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); |
json_encode — 对变量进行 JSON 编码。
说明:string json_encode ($value ),返回 value 值的 JSON 形式。
参数:待编码的 value ,除了resource 类型之外,可以为任何数据类型
该函数只能接受 UTF-8 编码的数据(译注:指字符/字符串类型的数据)
返回值:编码成功则返回一个以 JSON 形式表示的 string 。