zoukankan      html  css  js  c++  java
  • 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 = Json.createParser(new StringReader(jsonData));
     5 while (parser.hasNext()) {
     6    JsonParser.Event event = parser.next();
     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.println(event.toString());
    16          break;
    17       case KEY_NAME:
    18          System.out.print(event.toString() + " " +
    19                           parser.getString() + " - ");
    20          break;
    21       case VALUE_STRING:
    22       case VALUE_NUMBER:
    23          System.out.println(event.toString() + " " +
    24                             parser.getString());
    25          break;
    26    }
    27 }

      此示例包含三个步骤。

        ①通过调用Json.createParser静态方法获取解析器实例。

        ②使用JsonParser.hasNext和 JsonParser.next方法迭代解析器事件。

        ③对每个元素执行本地处理。

      该示例显示了解析器中的十种可能的事件类型。解析器的next方法将其推进到下一个事件。对于事件类型KEY_NAMEVALUE_STRINGVALUE_NUMBER,您可以通过调用方法获取元素的内容 JsonParser.getString。对于 VALUE_NUMBER事件,您还可以使用以下方法:JsonParser.isIntegralNumber

      • JsonParser.getInt
      • JsonParser.getLong
      • JsonParser.getBigDecimal

      输出如下:

      

     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数据

      此示例通过调用Json.createGenerator静态方法获取JSON生成器,该 方法将writer或输出流作为参数。该示例JSON数据写入到test.txt 通过嵌套的调用文件writewriteStartArray, writeStartObject,和writeEnd方法。该JsonGenerator.close 方法关闭底层的编写器或输出流。

     1 FileWriter writer = new FileWriter("test.txt");
     2 JsonGenerator gen = Json.createGenerator(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处理模型

    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之上添加参考节点信息项。

      DOM数据模型添加了更多信息,例如CDATA部分或实体引用。由于向后兼容性原因,更改DOM数据模型会很困难,但是,使用加载和保存模型,DOM能够在不破坏向后兼容性的情况下满足Infoset的要求。我们还能够使用抽象模式/ PSVI对象模型来表示PSV信息集。恕我直言,应该针对PSVI定义每个新的XML应用程序,包括XInclude。详情参见w3c文档:https://www.w3.org/2001/06/ProcessingModel-plh.html

  • 相关阅读:
    C#2008与.NET 3.5 高级程序设计读书笔记(31) 构建ASP.NET网页
    从零开始学习jQuery (二) 万能的选择器
    C#2008与.NET 3.5 高级程序设计读书笔记(32) ASP.NET Web控件、主题和母版页
    从零开始学习jQuery (六) jQuery中的Ajax
    从零开始学习jQuery (五) 事件与事件对象
    从零开始学习jQuery(剧场版) 你必须知道的javascript
    从零开始学习jQuery (一) 开天辟地入门篇
    从零开始学习jQuery (三) 管理jQuery包装集
    DateTime 中的 ToString 格式化输出
    IHttpHandler中的IsReusable属性
  • 原文地址:https://www.cnblogs.com/TomFord/p/10663437.html
Copyright © 2011-2022 走看看