Вскоре в Java появится стандартный набор API для обработки JSON как части Java EE 7. Этот стандарт определяется как JSR 353 — Java API для обработки JSON (JSON-P), и в настоящее время он находится на этапе окончательного утверждения. JSON-P предлагает как объектно-ориентированные, так и потоковые подходы, в этой статье я представлю потоковые API. Вы можете получить справочную реализацию JSON-P по ссылке ниже:
JsonGenerator (javax.json.stream)
JsonGenerator позволяет очень легко создавать JSON. Благодаря быстрому API-интерфейсу код для создания JSON очень похож на полученный JSON.
01
02
03
04
05
06
07
08
09
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
|
package blog.jsonp; import java.util.*; import javax.json.Json; import javax.json.stream.*; public class GeneratorDemo { public static void main(String[] args) { Map<String, Object> properties = new HashMap<String, Object>( 1 ); properties.put(JsonGenerator.PRETTY_PRINTING, true ); JsonGeneratorFactory jgf = Json.createGeneratorFactory(properties); JsonGenerator jg = jgf.createGenerator(System.out); jg.writeStartObject() // { .write( "name" , "Jane Doe" ) // "name":"Jane Doe", .writeStartObject( "address" ) // "address":{ .write( "type" , 1 ) // "type":1, .write( "street" , "1 A Street" ) // "street":"1 A Street", .writeNull( "city" ) // "city":null, .write( "verified" , false ) // "verified":false .writeEnd() // }, .writeStartArray( "phone-numbers" ) // "phone-numbers":[ .writeStartObject() // { .write( "number" , "555-1111" ) // "number":"555-1111", .write( "extension" , "123" ) // "extension":"123" .writeEnd() // }, .writeStartObject() // { .write( "number" , "555-2222" ) // "number":"555-2222", .writeNull( "extension" ) // "extension":null .writeEnd() // } .writeEnd() // ] .writeEnd() // } .close(); } } |
Выход
Ниже приведен результат запуска GeneratorDemo .
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
{ "name" : "Jane Doe" , "address" :{ "type" : 1 , "street" : "1 A Street" , "city" : null , "verified" : false }, "phone-numbers" :[ { "number" : "555-1111" , "extension" : "123" }, { "number" : "555-2222" , "extension" : null } ] } |
JsonParser (javax.json.stream)
Используя JsonParser, мы проанализируем выходные данные предыдущего примера, чтобы получить информацию об адресе. Анализатор JSON обеспечивает первичный обход событий, соответствующих структуре JSON. Различные данные могут быть получены из JsonParser в зависимости от типа события.
01
02
03
04
05
06
07
08
09
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
package blog.jsonp; import java.io.FileInputStream; import javax.json.Json; import javax.json.stream.JsonParser; import javax.json.stream.JsonParser.Event; public class ParserDemo { public static void main(String[] args) throws Exception { try (FileInputStream json = new FileInputStream( "src/blog/jsonp/input.json" )) { JsonParser jr = Json.createParser(json); Event event = null ; // Advance to "address" key while (jr.hasNext()) { event = jr.next(); if (event == Event.KEY_NAME && "address" .equals(jr.getString())) { event = jr.next(); break ; } } // Output contents of "address" object while (event != Event.END_OBJECT) { switch (event) { case KEY_NAME: { System.out.print(jr.getString()); System.out.print( " = " ); break ; } case VALUE_FALSE: { System.out.println( false ); break ; } case VALUE_NULL: { System.out.println( "null" ); break ; } case VALUE_NUMBER: { if (jr.isIntegralNumber()) { System.out.println(jr.getInt()); } else { System.out.println(jr.getBigDecimal()); } break ; } case VALUE_STRING: { System.out.println(jr.getString()); break ; } case VALUE_TRUE: { System.out.println( true ); break ; } default : { } } event = jr.next(); } } } } |
Выход
Ниже приведен результат запуска ParserDemo.
1
2
3
4
|
type = 1 street = 1 A Street city = null verified = false |
MOXy и API Java для обработки JSON (JSR-353)
Сопоставление вашего JSON с объектами домена по-прежнему является самым простым способом взаимодействия с JSON. Теперь, когда JSR-353 завершает работу, мы интегрируем его в JSON-привязку MOXy. Вы можете отслеживать наш прогресс в этом, используя следующую ссылку: