【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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

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

关注

评论

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

青海大学智慧微能源数字孪生可视化系统

ThingJS数字孪生引擎

大前端 可视化 3D可视化 数字孪生

阿里大牛亲码 Spring AOP详解笔记全网开源,学透并发只需3天

飞飞JAva

spring aop

Apache Hue介绍

大数据技术指南

hue 5月日更

云厂商下一块必争之地就是它了!

Serverless Devs

Serverless 云原生

Java程序员面试必备——过得了面试官,过不了HR?我教你

比伯

Java 编程 架构 程序人生 计算机

凭借师兄甩给我的通关秘籍,顺利拿到字节Offer

学Java关注我

Java 编程 架构 面试

5月20日,GaussDB将有大事发生

华为云开发者联盟

数据库 云原生 华为云 GaussDB TechWave

JavaScript设计模式之单例模式

程序员海军

JavaScript 大前端 设计模式 单例模式

python解释器+pycharm的安装

Geek_6370d5

#python学习之路

被解救的代码 - 代码即服务时代来了!

Serverless Devs

阿里云 Serverless 云原生

阿里P7大佬!王者级讲解ConcurrentHashMap源码,码农:太透彻了

牛哄哄的java大师

Java ConcurrentHashMap

一文带你全面了解java对象的序列化和反序列化

华为云开发者联盟

Java 序列化 java对象 反序列化 Serializable接口

阿里P7:每个码农都应该知道的MySQL主从复制方法,看这篇就够了

牛哄哄的java大师

Java MySQL 数据库

消息队列的两种模式

五分钟学大数据

kafka 5月日更

【技术干货】文件系统中的“锁”

焱融科技

容器 分布式 云原生 高性能 文件存储

【智慧农业】从“看天吃饭”到“知天而作”,乡村振兴全靠 TA

IoT云工坊

人工智能 物联网 智慧农业 庭院灌溉 温室大棚

苹果移动设备用什么管理比较好?有什么推荐?

懒得勤快

imazing 手机管理

如何下载和保存YouTube上的中英双语字幕和视频

flyfk

字幕

来了!这份阿里P7大佬梳理的Java注解和反射精髓笔记,信息量过大

飞飞JAva

Java

前端项目上传图片,压缩,拍照图片旋转解决方案

Vue js canvas axios

一线大厂最新总结Spring Security Oauth2.0认证授权全彩笔记

Java架构追梦

Java 阿里巴巴 架构 面试 spring security

停止维护的CentOS6,怎么使用yum?

运维研习社

Linux 5月日更

IM扫码登录技术专题(三):通俗易懂,IM扫码登录功能详细原理一篇就够

JackJiang

即时通讯 IM 扫码

拥有一个高性能低延时数据库是什么样的体验?

华为云开发者联盟

数据库 华为云 GaussDB GaussDB(for Cassandra) 低延时

GitHub霸屏文章!清华教授手写保姆级笔记Scala - 类,网友:太香了

牛哄哄的java大师

Java scala

300条数据变更引发的血案-记某十亿级核心mongodb集群部分请求不可用故障踩坑记

杨亚洲(专注MongoDB及高性能中间件)

数据库 mongodb 架构 MySQ 分布式数据库mongodb

高德 Serverless 平台建设及实践

Serverless Devs

阿里云 Serverless 云原生

GitHub开源的文言文编程语言、程序生成中国山水画、格律诗编辑程序

不脱发的程序猿

GitHub 开源 编程语言 传统文化

10个 解放双手的 IDEA 插件,这些代码都不用写(第二弹)

程序员小富

Java 后端 IDEA

消除数据孤岛,华为云DRS让一汽红旗ERP系统数据活起来

华为云开发者联盟

数据库 GaussDB 数据孤岛 华为云DRS ERP

干好开发者关系的十个职业发展秘诀

开发者关系

开发者关系 技术运营 DevRel

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