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 通过嵌套的调用文件writewriteStartArraywriteStartObject,和writeEnd方法。该JsonGenerator.close 方法关闭底层的编写器或输出流。

 

posted @ 2019-04-08 09:16  Teay  阅读(124)  评论(0编辑  收藏  举报