导航对象模型
以下代码演示了一种导航对象模型的简单方法:
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
方法关闭底层的编写器或输出流。