导航对象模型
以下代码演示了一种导航对象模型的简单方法:
|
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
|
OBJECTKey firstName: STRING DukeKey lastName: STRING JavaKey age: NUMBER 18Key streetAddress: STRING 100 Internet DrKey city: STRING JavaTownKey state: STRING JAKey postalCode: STRING 12345Key phoneNumbers: ARRAYOBJECTKey type: STRING mobileKey number: STRING 111-111-1111OBJECTKey type: STRING homeKey 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 方法关闭底层的编写器或输出流。