导航对象模型

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

以下代码演示了一种导航对象模型的简单方法:

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 方法关闭底层的编写器或输出流。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄