BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

处理JSON的Java API标准发布

| 作者 Bienvenido David III 关注 0 他的粉丝 ,译者 孙镜涛 关注 2 他的粉丝 发布于 2013年5月7日. 估计阅读时间: 9 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

作为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-b06org.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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

json解析我只信赖gson by wen bob

二者一比,高下立判。没感觉这个api有任何好处。。。真难得,居然能后知后觉的设计出一个一无是处的API

java就是要靠设计模式才能有得混 by zhang zhijia,.

这个API用到了多少设计模式啊,擦,给人的感觉就是看起来很牛逼的样子。

无语 by 天 小陈

这玩意儿跟xml的解析有什么区别?

根本不是设计给人类使用的。

无语 by 天 小陈

这玩意儿跟xml的解析有什么区别?

根本不是设计给人类使用的。

gson +1 by He henix

不如 gson 的反射式来的简单易用

Re: 无语 by Wong Peter

说的太有道理叻。一堆妥协出来的东西,能好到哪里去!

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

6 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT