写点什么

处理 JSON 的 Java API 标准发布

  • 2013-05-06
  • 本文字数:2087 字

    阅读完需:约 7 分钟

作为 JSON 处理(JSON-P)的 Java API,JSR-353 已经到达了最终的批准投票阶段。JSON-P(类似于 JAXP)由一个流 API(类似于 StAX)和一个对象模型 API(类似于 DOM)组成。它的参考实现是 jsonp ,目前正处在测试阶段,它基于 CDDL v1.1 和 GPL v2 协议开放源码。JSON-P 将作为即将发布的 Java EE 7 的一部分,同时 JAX-RS 会使用它作为默认的 JSON 实现。请注意,该 API 并没有包含 JSON 数据绑定(类似于 JAXB),同时它和更流行的 JSONP(JSON with padding)并没有关系。

JSON(JavaScript 对象标记)是一个轻量级数据交换格式,被广泛用于 Web 应用程序、REST 服务和 NoSQL 数据库。随着 JSON 的流行以及 Java 平台上诸多 JSON 类库(org.json、Jackson 及 google-gson 等)的出现,现在已经到了需要对开发者创建并使用 JSON 的方式进行标准化的阶段。JSON-P 就是即将到来的标准,它能够被独立地使用,或者作为 Java EE 7 容器的一部分。

JSON-P 分为两个 API,流 API(javax.json.stream)和对象模型 API(javax.json)。流 API 是一种底层且高效的解析和生成 JSON 的方式。它由两个主要的抽象构成——JsonParser 和 JsonGenerator。JsonParser 是一个拉模式解析器,允许以向前、只读的方式访问 JSON 输入源。JsonGenerator 则提供了向流中写入 JSON 的方法,并且允许使用方法链。Generator 输出 JSON 对象中的名 / 值对以及 JSON 数组中的值。

下面是 JsonParser 和 JsonGenerator 的代码示例。首先是我们将会读取或者创建的 JSON 数据。

复制代码
[
{
"type" : "home",
"number" : "(800) 111-1111"
},
{
"type" : "cell",
"number" : "(800) 222-2222"
}
]

下面是 JsonParser 示例,示例的底部是它的输出。

复制代码
JsonParserFactory factory = Json.createParserFactory(null);
JsonParser parser = factory.createParser(new StringReader(json));
while (parser.hasNext()) {
Event event = parser.next();
switch (event) {
case KEY_NAME: {
System.out.print(parser.getString() + "="); break;
}
case VALUE_STRING: {
System.out.println(parser.getString()); break;
}
}
}
type=home
number=(800) 111-1111
type=cell
number=(800) 222-2222

下面是 JsonGenerator 的示例,它向 System.out 中打印 JSON。

复制代码
JsonGeneratorFactory factory = Json.createGeneratorFactory(null);
JsonGenerator generator = factory.createGenerator(System.out);
generator.writeStartArray().
writeStartObject().
write("type", "home").
write("number", "(800) 111-1111").writeEnd().
writeStartObject().
write("type", "cell").
write("number", "(800) 222-2222").writeEnd().
writeEnd().close();

第二部分是对象模型 API,一个简单易用的高层 API,它基于流 API 实现。它创建了一个类似于树的结构代表内存中的 JSON 数据,能够非常容易地进行操纵和查询。对象模型 API 中最主要的抽象是 JsonObject 和 JsonArray,这两部分都是不可变的。JsonObject 提供了一个 Map 视图,用于访问模型中未被排序的名 / 值对集合。JsonArray 提供了一个列表视图访问排序的值序列。为了创建这些对象模型,你可以使用构建者模式(JsonObjectBuilder 和 JsonArrayBuilder)或者使用 JsonReader 从一个输入源(InputStream 或者 Reader)中读取它们。然后你可以使用 JsonWriter 将这些对象模型写入一个输出源(OutputStream 或者 Writer)。

下面是使用 JsonArrayBuilder 创建 JsonArray 的示例。需要再次提醒的是,我们使用的依然是上面的 JSON 数据。

复制代码
JsonBuilderFactory factory = Json.createBuilderFactory(null);
JsonArray jsonArray = factory.createArrayBuilder()
.add(factory.createObjectBuilder().
add("type", "home").
add("number", "(800) 111-1111"))
.add(factory.createObjectBuilder().
add("type", "cell").
add("number", "(800) 222-2222")).build();

下面是 JSONReader 示例。

复制代码
try (JsonReader jsonReader = Json.createReader(new StringReader(json))) {
JsonArray array = jsonReader.readArray();
System.out.println(array);
}

下面是 JsonWriter 示例。

复制代码
try (JsonWriter jsonWriter = Json.createWriter(System.out)) {
jsonWriter.writeArray(jsonArray);
}

如果你想尝试这个测试版本,那么可以下载jsonp ,或者使用 javax.json:javax.json-api:1.0-b06 和 _org.glassfish:javax.json:1.0-b06_ Maven 产品。你需要使用 Java SE 6 或者更高版本。如果想要获取更多信息,可以访问官方网站提供的 JSON 处理的 Java API ,或者阅读 JSON 处理的 Javadocs 。你还可以通过 YouTube 观看 JavaOne 提供的 JSON 处理的 Java API 呈现

『号外』:JavaOne 2013 大会将于 7 月 22–25 日在上海世博中心举行,内容涵盖使用 Java SE 构建现代应用程序、打造针对下一代智能设备的移动和嵌入式 Java 应用程序、编制基于 Java EE 的复杂企业解决方案以及在云环境中安全、无缝地构建和部署业务应用程序等,报名或查看详情请点击

查看英文原文 Standard Java API for JSON

2013-05-06 06:218389
用户头像

发布了 321 篇内容, 共 118.4 次阅读, 收获喜欢 19 次。

关注

评论

发布
暂无评论
发现更多内容

Java中关于多线程的知识点

Java学术趴

7月日更

STM32+ENC28J60+UIP协议栈实现WEB服务器示例

DS小龙哥

7月月更

架构实战营模块7作业

挖了蘑菇哩斯

架构实战营

从日常小事看如何工作

耳东@Erdong

7月月更

一年时间过去了,LiveData真的被Flow代替了吗? LiveData会被废弃吗?

编程的平行世界

android android jetpack

TableWidget 排序的多种方式

小肉球

qt 7月月更

mysql进阶(十四) 批量更新与批量更新多条记录的不同值实现方法

No Silver Bullet

MySQL 数据库 7月月更 批量更新

Qt | Qt的项目文件.pro文件详解

YOLO.

qt 7月月更

java零基础入门-java8新特性(中篇)

喵手

Java 7月月更

【MySql 实战】以 sql 的方式多表联动更新数据

安逸的咸鱼

MySQL 实战 7月月更

Okaleido tiger NFT即将登录Binance NFT平台,NFT权益时代即将开启

鳄鱼视界

关于Web响应式设计

程序员海军

Web 7月月更 响应式设计

树莓派3B搭建Flink集群

程序员欣宸

Java flink 树莓派 7月月更

C#入门系列(二十六) -- 程序集和命名空间

陈言必行

7月月更

云原生(九) | Devops篇之Jenkins安装与实战

Lansonli

云原生 7月月更

正则什么的,你让我写,我会难受,你让我用,真香!

掘金安东尼

前端 正则 7月月更

前端网络之跨域请求

Jason199

跨域 7月月更

架构师成长:关于我在 ArchSummit 大会收获了什么

宇宙之一粟

架构 个人感悟 ArchSummit 7月月更

王者荣耀商城异地多活部署设计

Geek_e8bfe4

Okaleido tiger NFT即将登录Binance NFT平台,你期待吗?

股市老人

zookeeper-集群leader选举

zarmnosaj

7月月更

【函数式编程实战】(一)Java演变与函数式编程

小明Java问道之路

Lambda stream 函数式编程 7月月更

王者荣耀商城异地多活架构设计

Geek_7a789a

Docker小白的福音:50条Docker命令清单,干就完了!

wljslmz

Docker Linux Docker 镜像 7月月更

Web3流量聚合平台Starfish OS,给玩家元宇宙新范式体验

股市老人

LeetCode-94. 二叉树的中序遍历(java)

bug菌

Leet Code 7月月更

git clone出错--必看贴

坚果

git Mac git 学习 7月月更

如何分析并设计性能测试场景

老张

性能测试 需求分析

iOS中内存管理(Autoreleasepool)

NewBoy

ios 前端 移动端 iOS 知识体系 7月月更

处理JSON的Java API标准发布_Java_Bienvenido David_InfoQ精选文章