JSON

简介:

  JSON是一种基于文本的数据交换格式,源自JavaScript,用于Web服务和其他连接的应用程序,下面大概介绍了一下JSON语法,使用概述以及生成和解析JSON的最常用的方法说明。

 

1、JSON语法

  JSON只定义了两个数据结构,对象和数组,对象是一组名称-值对,而数组是值列表。JSON定义了七种类型:字符串、数组、对象、数组、true、false 和 null。

  以下是列显示包含名称-值对的实例对象是JSON数据。名称的值“phonenumbers”是一个数组,其元素是两个对象

1
2
3
4
5
6
7
8
9
10
11
12
13
{
   "firstName": "Duke",
   "lastName": "Java",
   "age": 18,
   "streetAddress": "100 Internet Dr",
   "city": "JavaTown",
   "state": "JA",
   "postalCode": "12345",
   "phoneNumbers": [
      { "Mobile": "111-111-1111" },
      { "Home": "222-222-2222" }
   ]
}

JSON具有以下语法:

  对象用大括号,他们的名称-值对用逗号分隔,一对中的名称和值用冒号分隔。对象中的名称是字符串,而值可以是七种值类型中的任何一种,包括一个对象或数组。

  数组在括号中,他们的值用逗号分隔,数组中的每个值可以是不同的类型,包括另一个数组或对象。

  当对象和数组包含其他对象或数组时,数组具有树状结构。

 

JSON的使用

  JSON通常用作通用格式,用于序列化和反序列化通过Internet相互通信的应用程序中的数据。这些应用程序使用不同的编程语言创建,并在不同的环境中运行。JSON适用于这种情况,因为他是一个开放标准,易于读写,并且比其他的表示更紧凑。

  RESTful Web服务广泛使用JSON作为请求和响应中的数据格式。HTTP标头用于指示请求或响应的内容是JSON数据。

1
Content-Type: application/json

  JSON表示通常比XML表示更紧凑,因为JSON没有结束标记。与XML不同,JSON没有广泛接受的模式来定义和验证JSON数据的结构。

 

生成和解析JSON数据

 

为了生成和解析JSON数据,有两种编程模型,类似于用于XML文档的编程模型。

  • 对象模型创建一个表示内存中JSON数据的树。然后可以导航,分析或修改树。这种方法最灵活,允许进行需要访问树的完整内容的处理。但是,它通常比流模型慢,需要更多内存。对象模型通过一次导航整个树来生成JSON输出。

  • 流模型使用基于事件的解析器,一次读取一个元素的JSON数据。当对象或数组开始或结束,找到键或找到值时,解析器生成事件并停止处理。应用程序代码可以处理或丢弃每个元素,然后解析器继续执行下一个事件。这种方法适用于本地处理,其中元素的处理不需要来自其余数据的信息。流模型通过一次使用一个元素进行函数调用来生成给定流的JSON输出。

有许多JSON生成器和解析器可用于不同的编程语言和环境。Java EE平台中的JSON处理描述了Java API for JSON Processing(JSR 374)提供的功能。

Java EE包括对JSR 374的支持,JSR 374提供了一个API,用于使用生成和解析JSON数据中描述的对象模型或流模型来解析,转换和查询JSON数据。JSON Processing的Java API包含以下包:

  • javax.json软件包包含一个reader接口,一个writer接口,一个用于对象模型的模型构建器接口,以及用于JSON元素的实用程序类和Java类型。该软件包还包括几个实现其他JSON相关标准的类:JSON指针, JSON补丁JSON合并补丁。这些标准用于检索,转换或操纵对象模型中的值。表20-1列出了此包中的主要类和接口。

  • javax.json.stream包包含解析器接口和流模型的生成器接口。表20-2 列出了此包中的主要类和接口。

  • javax.json.spi软件包包含一个服务提供程序接口(SPI),用于插入JSON处理对象的实现。此包包含JsonProvider该类,该类包含服务提供者实现的方法。

详情参考官方文档:https://javaee.github.io/tutorial/jsonp002.html#CHDIHCEG

 

 -JavaEE中的 JSON processing

  对象模型API的四个用例:从JSON数据创建对象模型,从应用程序代码创建对象模型,导航对象模型以及将对象模型编写到流中。

    从JSON数据创建对象模型

  

1
2
3
4
5
6
7
import java.io.FileReader;
import javax.json.Json;
import javax.json.JsonReader;
import javax.json.JsonStructure;
...
JsonReader reader = Json.createReader(new FileReader("jsondata.txt"));
JsonStructure jsonst = reader.read();

对象引用jsonst可以是类型JsonObject或类型JsonArray,具体取决于文件的内容。JsonObject 并且JsonArray是亚型JsonStructure。此引用表示树的顶部,可用于导航树或将其作为JSON数据写入流。

 

    从应用程序代码创建对项模型

import javax.json.Json;
import javax.json.JsonObject;
...
JsonObject model = Json.createObjectBuilder()
   .add("firstName", "Duke")
   .add("lastName", "Java")
   .add("age", 18)
   .add("streetAddress", "100 Internet Dr")
   .add("city", "JavaTown")
   .add("state", "JA")
   .add("postalCode", "12345")
   .add("phoneNumbers", Json.createArrayBuilder()
      .add(Json.createObjectBuilder()
         .add("type", "mobile")
         .add("number", "111-111-1111"))
      .add(Json.createObjectBuilder()
         .add("type", "home")
         .add("number", "222-222-2222")))
   .build(); 

  对象引用model表示树的顶部,它是通过嵌套对add方法的调用并通过调用build方法构建的 。本JsonObjectBuilder类包含下列 add方法:

1
2
3
4
5
6
7
8
9
10
11
JsonObjectBuilder add(String name, BigDecimal value)
JsonObjectBuilder add(String name, BigInteger value)
JsonObjectBuilder add(String name, boolean value)
JsonObjectBuilder add(String name, double value)
JsonObjectBuilder add(String name, int value)
JsonObjectBuilder add(String name, JsonArrayBuilder builder)
JsonObjectBuilder add(String name, JsonObjectBuilder builder)
JsonObjectBuilder add(String name, JsonValue value)
JsonObjectBuilder add(String name, long value)
JsonObjectBuilder add(String name, String value)
JsonObjectBuilder addNull(String name) 
posted @ 2019-04-08 09:12  Teay  阅读(174)  评论(0编辑  收藏  举报