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);
|
流API是解析JSON文本的最有效方法。以下代码演示了如何创建JsonParser
对象以及如何使用事件解析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
|
import javax.json.Json;
import javax.json.stream.JsonParser;
...
JsonParser parser = Json.createParser( new StringReader(jsonData));
while (parser.hasNext()) {
JsonParser.Event event = parser.next();
switch (event) {
case START_ARRAY:
case END_ARRAY:
case START_OBJECT:
case END_OBJECT:
case VALUE_FALSE:
case VALUE_NULL:
case VALUE_TRUE:
System.out.println(event.toString());
break ;
case KEY_NAME:
System.out.print(event.toString() + " " +
parser.getString() + " - " );
break ;
case VALUE_STRING:
case VALUE_NUMBER:
System.out.println(event.toString() + " " +
parser.getString());
break ;
}
}
|
-
通过调用Json.createParser
静态方法获取解析器实例。
-
使用JsonParser.hasNext
和 JsonParser.next
方法迭代解析器事件。
-
对每个元素执行本地处理。
该示例显示了解析器中的十种可能的事件类型。解析器的next
方法将其推进到下一个事件。对于事件类型KEY_NAME
,VALUE_STRING
和VALUE_NUMBER
,您可以通过调用方法获取元素的内容JsonParser.getString
。对于 VALUE_NUMBER
事件,您还可以使用以下方法:
有关javax.json.stream.JsonParser
更多信息,请参阅该接口的Java EE API参考。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
START_OBJECT
KEY_NAME firstName - VALUE_STRING Duke
KEY_NAME lastName - VALUE_STRING Java
KEY_NAME age - VALUE_NUMBER 18
KEY_NAME streetAddress - VALUE_STRING 100 Internet Dr
KEY_NAME city - VALUE_STRING JavaTown
KEY_NAME state - VALUE_STRING JA
KEY_NAME postalCode - VALUE_STRING 12345
KEY_NAME phoneNumbers - START_ARRAY
START_OBJECT
KEY_NAME type - VALUE_STRING mobile
KEY_NAME number - VALUE_STRING 111 - 111 - 1111
END_OBJECT
START_OBJECT
KEY_NAME type - VALUE_STRING home
KEY_NAME number - VALUE_STRING 222 - 222 - 2222
END_OBJECT
END_ARRAY
END_OBJECT
|
以下代码演示了如何使用流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
方法关闭底层的编写器或输出流。
XML
XML简介
扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。
XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
-
- XML 指可扩展标记语言(EXtensible Markup Language)
- XML 是一种标记语言,很类似 HTML
- XML 的设计宗旨是传输数据,而非显示数据
- XML 标签没有被预定义。您需要自行定义标签。
- XML 被设计为具有自我描述性。
- XML 是 W3C 的推荐标准
XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。
XML 是独立于软件和硬件的信息传输工具。
了解更多进入w3c网站了解:http://www.w3school.com.cn/xml/xml_intro.asp
XML处理模型(XML processing model)
XML处理模型定义了如何将XML文档是由解释应用。 然后可以使用不同视图在屏幕上呈现文档,用于处理XML数据等。模型可以分为两个阶段:用于定义数据模型的XML管道和旨在使用的后XML管道数据模型。
XML管道是参与每个步骤的规范的XML处理器。如何以及何时在XML处理器中进行规范(由Unicode,IETF,W3C或其他组织定义)。
XML应用程序的期望是什么?基于已定义的子集规范:Unicode 3.1.0,RFC 2396,XML 1.0,命名空间,XML Base,XInclude,XML Schema和XLink / XPointer?或者仍然继续我们当前的方法(<7!),即每个XML应用程序定义自己的集合?当然,答案并不容易,但希望Infoset将减少XML管道中涉及的规范数量:Infoset,XInclude,XML Schema,XLink / XPointer(<4!)。PSV Infoset减少了这个数字:PSVI,XInclude,XLink / XPointer。
这导致我们采用通用数据模型。由于历史原因,在W3C中开发了几个数据模型:DOM,XPath 1.0,Infoset,PSV Infoset,XML Query等。它们中的每一个都是向前一个添加/删除信息。例如,最近的XQuery 1.0和XPath 2.0数据模型正在PSV Infoset之上添加参考节点信息项。
DOM数据模型添加了更多信息,例如CDATA部分或实体引用。由于向后兼容性原因,更改DOM数据模型会很困难,但是,使用加载和保存模型,DOM能够在不破坏向后兼容性的情况下满足Infoset的要求。我们还能够使用抽象模式/ PSVI对象模型来表示PSV信息集。恕我直言,应该针对PSVI定义每个新的XML应用程序,包括XInclude。
详细参考W3C:https://www.w3.org/2001/06/ProcessingModel-plh.html