Jason与Xml的解析过程
前⾔:json和xml都是⽤来进⾏数据的传输和交换的,是⽬前⽤来传输数据⽤的最多的两种技术,下⾯来认识⼀下它们及其解析过程。⼀、Jason
1、什么是Jason?
JSON是⼀种基于⽂本的轻量级数据交换格式,源⾃JavaScript,⽤于Web服务和其他连接的应⽤程序,易于⼈阅读和编写, 同时也易于机器解析和⽣成
JSON是存储和交换⽂本信息的语法,类似XML
JSON采⽤完全独⽴于语⾔的⽂本格式,但是也使⽤了类似于C语⾔家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python 等),这些特性使JSON成为理想的数据交换语⾔
2、Jason的语法
  JSON只定义了两个数据结构:对象和数组。对象是⼀组名称 - 值对,⽽数组是值列表。JSON定义了七种值类型:字符串,数字,对象,数组,true,false和null。
对象⽤⼤括号({})括起来,它们的名称 - 值对⽤逗号(,)分隔,⼀对中的名称和值⽤冒号(:)分隔。对象中的名称是字符串,⽽值可以是七种值类型中的任何⼀种,包括另⼀个对象或数组。
数组括在括号([])中,它们的值⽤逗号(,)分隔。数组中的每个值可以是不同的类型,包括另⼀个数组或对象。
当对象和数组包含其他对象或数组时,数据具有树状结构
  JSON通常⽤作通⽤格式,⽤于序列化和反序列化通过Internet相互通信的应⽤程序中的数据。这些应⽤程序使⽤不同的编程语⾔创建,并在不同的环境中运⾏。JSON适⽤于这种情况,因为它是⼀个开放标准,易于读写,并且⽐其他表⽰更紧凑
  以下⽰例显⽰包含名称 - 值对的⽰例对象的JSON数据。名称的值"phoneNumbers"是⼀个数组,其元素是两个对象。
1 {
2    "firstName": "Duke",
3    "lastName": "Java",
4    "age": 18,
5    "streetAddress": "100 Internet Dr",
6    "city": "JavaTown",
7    "state": "JA",
8    "postalCode": "12345",
9    "phoneNumbers": [
10      { "Mobile": "111-111-1111" },
11      { "Home": "222-222-2222" }
12    ]
13 }
3、Jason数据的⽣成和解析
为了⽣成和解析JSON数据,有两种编程模型,类似于⽤于XML⽂档的编程模型。
对象模型创建⼀个表⽰内存中JSON数据的树。然后可以导航,分析或修改树。这种⽅法最灵活,允许进⾏需要访问树的完整内容的处理。但是,它通常⽐流模型慢,需要更多内存。对象模型通过⼀次导航整个树来⽣成JSON输出。
流模型使⽤基于事件的解析器,⼀次读取⼀个元素的JSON数据。当对象或数组开始或结束,到键或到值时,解析器⽣成事件并停⽌处理。应⽤程序代码可以处理或丢弃每个元素,然后解析器继续执⾏下⼀个事件。这种⽅法适⽤于本地处理,其中元素的处理不需要来⾃其余数据的信息。流模型通过⼀次使⽤⼀个元素进⾏函数调⽤来⽣成给定流的JSON输出。
  ①使⽤解析器读取JSON数据
  流API是解析JSON⽂本的最有效⽅法。以下代码演⽰了如何创建JsonParser对象以及如何使⽤事件解析JSON数据: 
1 import javax.json.Json;
2 import javax.json.stream.JsonParser;
3 ...
4 JsonParser parser = ateParser(new StringReader(jsonData));
5 while (parser.hasNext()) {
6    JsonParser.Event event = ();
7    switch(event) {
8      case START_ARRAY:
9      case END_ARRAY:
10      case START_OBJECT:
11      case END_OBJECT:
12      case VALUE_FALSE:
13      case VALUE_NULL:
14      case VALUE_TRUE:
15          System.out.String());
16          break;
17      case KEY_NAME:
18          System.out.String() + " " +
19                          String() + " - ");
20          break;
21      case VALUE_STRING:
22      case VALUE_NUMBER:
23          System.out.String() + " " +
24                            String());
25          break;
26    }
27 }
  此⽰例包含三个步骤。
    ①通过调⽤ateParser静态⽅法获取解析器实例。
    ②使⽤JsonParser.hasNext和 ⽅法迭代解析器事件。
    ③对每个元素执⾏本地处理。
  该⽰例显⽰了解析器中的⼗种可能的事件类型。解析器的next⽅法将其推进到下⼀个事件。对于事件类
型KEY_NAME,VALUE_STRING和VALUE_NUMBER,您可以通过调⽤⽅法获取元素的内容 String。对于 VALUE_NUMBER事件,您还可以使⽤以下⽅法:JsonParser.isIntegralNumber
  输出如下:
1 START_OBJECT
2 KEY_NAME firstName - VALUE_STRING Duke
3 KEY_NAME lastName - VALUE_STRING Java
4 KEY_NAME age - VALUE_NUMBER 18
5 KEY_NAME streetAddress - VALUE_STRING 100 Internet Dr
6 KEY_NAME city - VALUE_STRING JavaTown
7 KEY_NAME state - VALUE_STRING JA
8 KEY_NAME postalCode - VALUE_STRING 12345
9 KEY_NAME phoneNumbers - START_ARRAY
10 START_OBJECT
11 KEY_NAME type - VALUE_STRING mobile
12 KEY_NAME number - VALUE_STRING 111-111-1111
13 END_OBJECT
14 START_OBJECT
15 KEY_NAME type - VALUE_STRING home
16 KEY_NAME number - VALUE_STRING 222-222-2222
17 END_OBJECT
18 END_ARRAY
19 END_OBJECT
  ②使⽤⽣成器编写JSON数据
  此⽰例通过调⽤ateGenerator静态⽅法获取JSON⽣成器,该 ⽅法将writer或输出流作为参数。该⽰例JSON数据写⼊
到 通过嵌套的调⽤⽂件write,writeStartArray, writeStartObject,和writeEnd⽅法。该JsonGenerator.close ⽅法关闭底层的编写器或输出流。
1 FileWriter writer = new FileWriter("");
2 JsonGenerator gen = ateGenerator(writer);
3 gen.writeStartObject()
4    .write("firstName", "Duke")
5    .write("lastName", "Java")
6    .write("age", 18)
7    .write("streetAddress", "100 Internet Dr")
8    .write("city", "JavaTown")
9    .write("state", "JA")
10    .write("postalCode", "12345")
11    .writeStartArray("phoneNumbers")
12      .writeStartObject()
13          .write("type", "mobile")
14          .write("number", "111-111-1111")
15      .writeEnd()
16      .writeStartObject()
17          .write("type", "home")
18          .write("number", "222-222-2222")
19      .writeEnd()
20    .writeEnd()
21 .writeEnd();
22 gen.close();
⼆、Xml
1、什么是Xml?
XML是⼀种可扩展标记语⾔,很类似HTML,通过此种标记,计算机之间可以处理包含各种信息的⽂章等
XML的设计宗旨是传输数据,⽽⾮显⽰数据,所以它也是数据传输常⽤的常⽤⼯具
XML标签没有被预定义。您需要⾃⾏定义标签。
XML被设计为具有⾃我描述性
XML不是HTML的替代,XML⽤于传输数据,⽽HTML⽤于格式化并显⽰数据
2、Xml的语法
  类似采⽤HTML的标签语法。
3、Xml处理模型
bigdecimal格式化两位小数
XML处理模型定义了如何将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之上添加参考节点信息项。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。