速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

处理 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:218432
用户头像

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

关注

评论

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

设计模式前传——为什么要学设计模式

大头星

Java 面试 设计模式

Deno 入门手册:附大量 TypeScript 代码实例

寇云

node.js typescript

游戏夜读 | Two Sum问题的八个解

game1night

Kafka系列第7篇:你必须要知道集群内部工作原理的一些事!

z小赵

大数据 kafka 实时计算

项目提升服务过程与总结稿

Geek_bc0aff

DDD 实践手册(番外篇: 事件风暴-概念)

Joshua

领域驱动设计 DDD 事件风暴 事件驱动 Event Storming

ZooKeeper,到底如何选主?

奈学教育

产品周刊 | 第 15 期(20200517)

八味阁

产品 设计 产品经理 产品设计

换脸新潮流:BIGO风靡全球的人脸风格迁移技术

DT极客

重新强调完成的定义

Bob Jiang

Scrum 完成的定义 DoD definition of done

程序员的晚餐 | 5 月 18 日 瓠子,年少时的味道

清远

美食

Vue+SpringBoot+SpreadJS 实现的在线文档

葡萄城技术团队

Spring Boot Vue SpreadJS

半小时手工解决的活,让我意外学会了 python 的 pdfkit 库

小匚

Python python教程

Kotlin 协程实践(2)之 异步和Callback地狱

陈吉米

Java kotlin 协程

如何更自信的写作

董一凡

写作

给苹果提醒APP配个助手

BabyKing

提醒助手 TODO 奇妙清单 Reminders Helper

NIO看破也说破(四)—— Java的NIO

小眼睛聊技术

Java 学习 开源 架构 后端

识别代码中的坏味道(三)

Page

敏捷开发 面向对象 重构 代码质量 代码坏味道

回“疫”录(20):世界从来不会欺负听话的人

小天同学

疫情 回忆录 现实纪录 纪实

Redis缓存三大问题

Bruce Duan

redis 缓存穿透 缓存击穿 缓存雪崩

npm下载electron缓慢的问题

玏佾

npm Electron

东哥和刘亦菲的故事

张利东

R

Live2D for Unity入门篇 4.x

波波

编程 游戏开发 Live2D Unity

从零开始制作一台计算机-概述

小兵

计算机基础

Web3极客日报#127

谢锐 | Frozen

区块链 开源 技术社区 Rebase Web3 Daily

JAVA主流锁

颇风

Java 多线程

Spring Security 中的授权操作原来这么简单

江南一点雨

Java spring Spring Boot spring security

单核小鸡上的Minikube实践(一)

摩登土狗

Docker Linux DevOps k8s minikube

Web3极客日报 #128

谢锐 | Frozen

区块链 开源 技术社区 Rebase Web3 Daily

谈谈控制感(7):底线思维与控制感

史方远

职场 心理 成长

MacOS 下使用VSCode进行GoLang Test报错

北纬32°

macos vscode Unit Test debug Go 语言

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