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"
]
}