JavaEE 7教程

JSON处理

  JSON处理I在JSR 353定义为Java API, JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。格式易于人和机器的读写。JSON是一个JavaScript子集,但它又是一个独立于语言的数据格式。

一个JSON结构可以建立以下:
名称/值的集合,通常实现为字典,哈希表,或 关联数组
值的排序列表,通常实现为一个数组,列表,或序列

以下示例JSON表示的对象描述
电影:
{
"name": "The Matrix",
"actors": [
"Keanu Reeves",
"Laurence Fishburne",
"Carrie-Ann Moss"
],
"year": 1999
}
  对象具有三个名称/值。第一个名是为一个字符串值的名称 电影名,第二个名是一个电影中的演员数组的演员,第三个名今年上映的年。

   JSON迅速成为开发商的首选 Web服务。目前,Java应用程序使用不同的实现JSON。这些库包捆绑在应用中,会增加部署文档的文件体量。JSON处理Java API 提供一个标准的API生成与解析JSON, 从而使用API的应用程序更小,便携式(库包放到服务器容器中了)。

API目标的是:
以生产流媒体的方式在使用JSON文本(类似于StAX API for XML)
用JSON文本构建Java对象模型(类似于DOM API for XML)
实现JSON文本到Java对象绑定。


Streaming API

  流式API提供了一种方法来分析和流生成JSON文本,该API提供了一个事件解析器和允许应用程序开发人员询问下一个事件。 这使开发人员实现对JSON处理更多的程序控制。分析器的事件可以被处理或丢弃,或下一个事件可能会产生。流式API是一个低级别的API设计,用来处理大量的 JSON数据比较有效。其他json框架(如JSON绑定)也可以实现拓展 这个API。

使用流式API生成JSON

  流式API提供了一种方法,一次一个事件产生JSON流 。 jsongenerator包含writexxx方法,将JSON对象写为JSON数组中的名称/值对:
JsonGeneratorFactory factory = Json.createGeneratorFactory(null);
JsonGenerator gen = factory.createGenerator(System.out);
gen.writeStartObject().writeEnd();

这是产生一个空的数组:{ },使用下面可以产生非空数组:

gen.writeStartObject()
  .write("apple", "red")
  .write("banana", "yellow")
  .writeEnd();

一对名称/值写入到Json,名称为第一 参数,值作为第二个参数。该值可以是BigDecimal, 整数,布尔,双,int,长,字符串和jsonvalue等。 生成的JSON结构:
{
"apple":"red",
"banana":"yellow"
}
产生两个对象的数组:
gen.writeStartArray()
 .writeStartObject()
  .write("apple", "red")
  .writeEnd()
 .writeStartObject()
  .write("banana", "yellow")
  .writeEnd()
 .writeEnd();


生成的JSON结构:
[
{ "apple":"red" },
{ "banana":"yellow" }
]


嵌套数组的结构产生:
gen.writeStartObject()
 .write("title", "The Matrix")
 .write("year", 1999)
 .writeStartArray("cast")
  .write("Keanu Reeves")
  .write("Laurence Fishburne")
  .write("Carrie-Anne Moss")
  .writeEnd()
 .writeEnd();
生成的JSON结构:
{
"title":"The Matrix",
"year":1999,
"cast":[
"Keanu Reeves",
"Laurence Fishburne",
"Carrie-Anne Moss"
]
}

使用应用流式API消费JSON


  消费就是解析,将JSON转为对象,jsonparser包含使用数据流模型解析JSON的方法。它提供只读访问编程模型。

JsonParser parser = Json.createParser(new FileInputStream(...));

这个代码显示了如何获得的InputStream分析器 API中创建分析器。 jsonparser也可以从一个reader中创造:
JsonParser parser = Json.createParser(new StringReader(...));

这是从StringReader中创建, 你可以使用jsonparserfactory创建多个解析器实例:
JsonParserFactory factory = Json.createParserFactory(null);
JsonParser parser1 = factory.createParser(...);
JsonParser parser2 = factory.createParser(...);

  pull-parsing拉-解析编程模型可以用来解析JSON。解析过程中需要一行行读取,其next方法 返回下一个解析状态的事件,可能是下列类型:
START_ARRAY
END_ARRAY
START_OBJECT
END_OBJECT
KEY_NAME
VALUE_STRING
VALUE_NUMBER
VALUE_TRUE
VALUE_FALSE
VALUE_NULL
对于空的JSON对象语法分析器生成START_OBJECT 和 END_OBJECT 事件 。


对于对象的一对名称/值:
{
"apple":"red",
"banana":"yellow"
}
产生的事件中显示为粗体:
{START_OBJECT
"apple"KEY_NAME:"red"VALUE_STRING,
"banana"KEY_NAME:"yellow"VALUE_STRING
}

一个包含有两个JSON对象的数组生成事件,如下显示为粗体:
[START_ARRAY
{START_OBJECT "apple"KEY_NAME:"red"VALUE_STRING }END_OBJECT,
{START_OBJECT "banana"KEY_NAME:"yellow"VALUE_STRING }END_OBJECT
]END_ARRAY

下面是嵌套数组的事件:

{START_OBJECT
 "title"KEY_NAME:"The Matrix"VALUE_STRING,
 "year"KEY_NAME:1999VALUE_NUMBER,
 "cast"KEY_NAME:[START_ARRAY
   "Keanu Reeves"VALUE_STRING,
   "Laurence Fishburne"VALUE_STRING,
   "Carrie-Anne Moss"VALUE_STRING
 ]END_ARRAY
}END_OBJECT

 

对象模型API

  对象模型API是一个高层次的API,提供了有关 JSON对象和数组结构的不可变对象模型。这些JSON结构被表示为对象 ,通过Java类型JSONObject和jsonarray模型。JSONObject提供MAP视图 ,jsonarray提供列表视图。

   这种编程模型是最灵活的,能够处理需要随机 访问树的完整内容。然而,它往往是不一样有效,因为需要更多的内存。

   对象模型API类似于DOM API的XML应用生成器模式, 要创建这些对象模型实现接口jsonreader(消费 JSON)和jsonobjectbuilder和jsonarraybuilder(产生的JSON)。

使用对象模型API消费JSON

   jsonreader包含从输入读取JSON数据转换到对象模型的方法。 jsonreader可以从输入流创建:
JsonReader reader = Json.createReader(new FileInputStream(...));
这个代码显示了如何从获得的InputStream创建新的解析器 API。 jsonreader也可以从Reader创建:
JsonParser parser = Json.createParser(new StringReader(...));
这个代码显示了如何创建一个StringReader分析器。

你可以使用jsonreaderfactory创建多个解析器实例:
JsonReaderFactory factory = Json.createReaderFactory(null);
JsonReader parser1 = factory.createReader(...);
JsonReader parser2 = factory.createReader(...);

一个空的JSON对象可以读取:
JsonReader jsonReader = Json.createReader(new StringReader("{}"));
JsonObject json = jsonReader.readObject();

在这段代码中,一个jsonreader通过StringReader初始化,读取JSON的空 对象。调用readObject方法返回JSONObject实例。

两个对象的名称/值对可以读取:
jsonReader = Json.createReader(new StringReader("{"
 + " \"apple\":\"red\","
 + " \"banana\":\"yellow\""
 + "}"));
JsonObject json = jsonReader.readObject();
json.getString("apple");
json.getString("banana");
在这段代码中,GetString方法返回的对象的键值 。其他的getXXX方法可用于基于数据类型的值的访问。

一个有两个对象数组读取:
jsonReader = Json.createReader(new StringReader("["
 + " { \"apple\":\"red\" },"
 + " { \"banana\":\"yellow\" }"
 + "]"));
JsonArray jsonArray = jsonReader.readArray();


一个嵌套的结构可以读作:
jsonReader = Json.createReader(new StringReader("{"
+ " \"title\":\"The Matrix\","
+ " \"year\":1999,"
+ " \"cast\":["
+ " \"Keanu Reeves\","
+ " \"Laurence Fishburne\","
+ " \"Carrie-Anne Moss\""
+ " ]"
+ "}"));
json = jsonReader.readObject();

使用对象模型生成JSON API
    jsonobjectbuilder可以用来创建对象的JSON。jsonarraybuilder可以用来 创建类型是 jsonarray的JSON阵列:

JsonObject jsonObject = Json.createObjectBuilder().build();

在这段代码中,一个jsonobjectbuilder是用来创建一个空的对象。一个空的对象, 没有名称/值对,生成的JSON结构:
{ }

通过jsonbuilderfactory多个实例被创建 :
JsonBuilderFactory factory = Json.createBuilderFactory(null);
JsonArrayBuilder arrayBuilder = factory.createArrayBuilder();
JsonObjectBuilder objectBuilder = factory.createObjectBuilder();

加入一对键值:
jsonwriter:
Json.createObjectBuilder()
.add("apple", "red")
.add("banana", "yellow")
.build();
生成的JSON结构:
{
"apple":"red",
"banana":"yellow"
}

对象数组:
JsonArray jsonArray = Json.createArrayBuilder()
.add(Json.createObjectBuilder().add("apple","red"))
.add(Json.createObjectBuilder().add("banana","yellow"))
.build();
生成的JSON结构:
[
{ "apple":"red" },
{ "banana":"yellow" }
]

嵌套产生:
jsonArray = Json.createArrayBuilder()
 .add(Json.createObjectBuilder()
 .add("title", "The Matrix")
 .add("year", 1999)
 .add("cast", Json.createArrayBuilder()
   .add("Keanu Reaves")
   .add("Laurence Fishburne")
   .add("Carrie-Anne Moss")))
 .build();
生成的JSON结构:
{
"title":"The Matrix",
"year":1999,
"cast":[
 "Keanu Reeves",
 "Laurence Fishburne",
 "Carrie-Anne Moss"
 ]
}