JSON续
导航对象模型
以下代码演示了一种导航对象模型的简单方法:
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
|
import javax.json.JsonValue; import javax.json.JsonObject; import javax.json.JsonArray; import javax.json.JsonNumber; import javax.json.JsonString; ... public static void navigateTree(JsonValue tree, String key) { if (key != null ) System.out.print( "Key " + key + ": " ); switch (tree.getValueType()) { case OBJECT: System.out.println( "OBJECT" ); JsonObject object = (JsonObject) tree; for (String name : object.keySet()) navigateTree(object.get(name), name); break ; case ARRAY: System.out.println( "ARRAY" ); JsonArray array = (JsonArray) tree; for (JsonValue val : array) navigateTree(val, null ); break ; case STRING: JsonString st = (JsonString) tree; System.out.println( "STRING " + st.getString()); break ; case NUMBER: JsonNumber num = (JsonNumber) tree; System.out.println( "NUMBER " + num.toString()); break ; case TRUE: case FALSE: case NULL: System.out.println(tree.getValueType().toString()); break ; } } |
该方法navigateTree
可以与内置的模型被用来 创建从JSON数据对象模型和 创建从应用程序代码的对象模型如下:
1
|
navigateTree(model, null ); |
该navigateTree
方法有两个参数:JSON元素和键。该键仅用于帮助打印对象内的键值对。树中的元素由JsonValue
类型表示。如果元素是对象或数组,则对对象或数组中包含的每个元素进行此方法的新调用。如果元素是值,则将其打印到标准输出。
该JsonValue.getValueType
方法将元素标识为对象,数组或值。对于对象,该JsonObject.keySet
方法返回一组包含对象中键的字符串,该 JsonObject.get(String name)
方法返回其键所在元素的值name
。对于数组,JsonArray
实现 List<JsonValue>
接口。您可以将增强for
循环与 Set<String>
实例返回的JsonObject.keySet
实例一起使用JsonArray
,如本示例所示。
从Application Code创建对象navigateTree
模型中构建的模型的方法产生以下输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
OBJECT Key firstName: STRING Duke Key lastName: STRING Java Key age: NUMBER 18 Key streetAddress: STRING 100 Internet Dr Key city: STRING JavaTown Key state: STRING JA Key postalCode: STRING 12345 Key phoneNumbers: ARRAY OBJECT Key type: STRING mobile Key number: STRING 111 - 111 - 1111 OBJECT Key type: STRING home Key number: STRING 222 - 222 - 2222 |
写入流:
创建从JSON数据的对象模型和创建从应用程序代码的对象模型的对象可被写入到使用一个流JsonWriter
类,如下所示:
1
2
3
4
5
6
7
8
9
10
|
import java.io.StringWriter; import javax.json.JsonWriter; ... StringWriter stWriter = new StringWriter(); JsonWriter jsonWriter = Json.createWriter(stWriter); jsonWriter.writeObject(model); jsonWriter.close(); String jsonData = stWriter.toString(); System.out.println(jsonData); |
该Json.createWriter
方法将输出流作为参数。该JsonWriter.writeObject
方法将对象写入流。该 JsonWriter.close
方法关闭基础输出流。
以下示例使用try
-with-resources自动关闭JSON编写器:
1
2
3
4
5
6
7
8
|
StringWriter stWriter = new StringWriter(); try (JsonWriter jsonWriter = Json.createWriter(stWriter)) { jsonWriter.writeObject(model); } String jsonData = stWriter.toString(); System.out.println(jsonData); |
使用生成器编写JSON数据
如何使用流API将JSON数据写入文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
FileWriter writer = new FileWriter( "test.txt" ); JsonGenerator gen = Json.createGenerator(writer); gen.writeStartObject() .write( "firstName" , "Duke" ) .write( "lastName" , "Java" ) .write( "age" , 18 ) .write( "streetAddress" , "100 Internet Dr" ) .write( "city" , "JavaTown" ) .write( "state" , "JA" ) .write( "postalCode" , "12345" ) .writeStartArray( "phoneNumbers" ) .writeStartObject() .write( "type" , "mobile" ) .write( "number" , "111-111-1111" ) .writeEnd() .writeStartObject() .write( "type" , "home" ) .write( "number" , "222-222-2222" ) .writeEnd() .writeEnd() .writeEnd(); gen.close(); |
此示例通过调用Json.createGenerator
静态方法获取JSON生成器,该 方法将writer或输出流作为参数。该示例JSON数据写入到test.txt
通过嵌套的调用文件write
,writeStartArray
,writeStartObject
,和writeEnd
方法。该JsonGenerator.close
方法关闭底层的编写器或输出流。