处理JSON的Java API :JSON的简介

原文链接  作者:Jitendra Kotamraju   译者:撒木

处理JSON的各种解析、生成、处理、转换和查询的JAVA API

JSON (JavaScript Object Notation)是一种轻量级的、基于文本的、完全独立于语言的数据交换格式。它非常方便人们和机器的阅读和书写。JSON 有两种结构类型的表现方式:对象和数组。对象是名/值对的无序集合。数组是值(value)的有序集合。值的类型可以是字符串(在双引号中)、数字(整数或浮点数)、逻辑值(true或false)、数组(在方括号中)、对象(在花括号中)、null。

列表1来自 Wikipedia 以JSON表示的一个对象去描述一个人。这个人的姓和名都是字符串类型,一个数值表示了年龄,一个对象表示了这个人的地址,还有一个数组对象表示了电话号码。

{
    "firstName": "John",
    "lastName": "Smith",
    "age": 25,
    "address": {
        "streetAddress": "21 2nd Street",
        "city": "New York",
        "state": "NY",
        "postalCode": 10021
    },
    "phoneNumbers": [
        {
            "type": "home",
            "number": "212 555-1234"
        },
        {
            "type": "fax",
            "number": "646 555-4567"
        }
    ]
}

列表 1. JSON表示对象的一个例子

JSON通常被用在Ajax应用、配置、数据库和RESTful web services。几乎所有流行的网站都提供了JSON的数据交换方式在他们的RESTful web services上。

处理JSON

处理JSON的Java API (JSR 353)提供了各种便捷的API,其中包括解析、生成、转换和使用对象模 型或流来查询JSON。

对象模型的API在内存中产生一个随机存取的树状结构来代表了JSON数据。这个树可以被操作和查询。这种编程模型可以很灵活的处理需要随机存取完整内容的树。但是,对象模型通常都没有流模型效率高,而且需要的存储空间也比流模型多

流API提供了一种以流来解析和生成JSON的方法。它把解析生成JSON的控制权交给了程序猿。流API提供了一种基于事件的解析器并且允许开发者询问下一个事件,而不是再一个回调函数中负责事件的处理。它给予了开发者更多的处理JSON的过程控制。应用程序代码可以处理或抛弃解析器事件,也可以询问下一个事件(pull the event)。流模型适合于部分不需要的数据的随机存取的局部处理。同样的,流API提供了一种通过写一次事件生成结构良好的JSON流。

对象模型API

对象模型API和文件对象模型(DOM)API在xml中很相似。这是一个高级的API,它为JSON对象和数组结构提供了不可变的对象模型。这些JSON结构通过使用 JsonObjectJsonArray被表示为对象模型。表格1中展示了对象模型API的主要的类和接口。

JsonObject提供了一个Map视图去存取含有名/值对的无序集合。同样的,JsonArray提供了一个List去存取含有值的有序序列。

表格 1.对象模型API中主要的类和接口

类和接口 描述
Json 包含产生JSON readers,writers,builders,和他们的工厂对象的静态方法
JsonGenerator 一次一个值的将JSON数据写入一个流中。
JsonReader 从流中读取JSON数据,并且创建一个对象模型在内存中
JsonObjectBuilder
JsonArrayBuilder
在内存中通过向源码中加入一个值,创建一个对象模型或者数组模型
JsonWriter 从内存中拿出一个对象模型写入流中
JsonValue
JsonObject
JsonArray
JsonString
JsonNumber
表示JSON数据中的数据类型.

JsonObject,JsonArray,JsonString 和JsonNumber 是JsonValue的子类型。他们是被定义在API中的常量,有null,true,false的JSON值。

对象模型API使用建造者设计模式,从头创建这些对象模型。应用程序代码可以使用接口JsonObjectBuilder 来创建模型来代表JSON对象。由此产生的模型是JsonObject。应用程序代码可以使用接口JsonArrayBuilder来创建模型来代表JSON数组。由此产生的模型JsonArray。

这些对象模型也可以从一个输入源(例如InputStream或Reader)使用接口JsonReader来创建。同样的,可以写出到一个输出源(例如OutputStream或Writer)使用类JsonWriter。

举个例子,让我们使用对象模型API写个搜索Facebook的公开岗位的code。Facebook的API给我们了搜索结果在列表2中。

 {
2     "data" : [
3         { "from" : { "name" : "xxx", ... }, "message" : "yyy", ... },
4         { "from" : { "name" : "ppp", ... }, "message" : "qqq", ... },
5         ...
6     ],
7     ...
8 }


列表 2. 搜索Facebook公开岗位的JSON示例

我们可以使用对象模型API取得关于JAVA的名字和他们的岗位。
在列表3中,
第3行创建了JsonReader;
第5行创建了返回结果的JsonObject;
第7行循环每一个结果;
第8-11行取得了公布人的姓名和职位,并且打印它们
注意:JsonReader和其他API上的对象可以用于带有资源的try语法中(这也叫做自动资源管理[ARM]).

 1 URL url = new URL("https://graph.facebook.com/search?q=java&type=post");
 2 try (InputStream is = url.openStream();
 3      JsonReader rdr = Json.createReader(is)) {
 4
 5     JsonObject obj = rdr.readObject();
 6     JsonArray results = obj.getJsonArray("data");
 7     for (JsonObject result : results.getValuesAs(JsonObject.class)) {
 8         System.out.print(result.getJsonObject("from").getString("name"));
 9         System.out.print(": ");
10         System.out.println(result.getString("message", ""));
11         System.out.println("-----------");
12     }
13 }

列表 3. 使用对象模型API处理Facebook的岗位。

流API

流API与XML的流API(StAX)类似,它是由接口JsonParser和JsonGenerator组成。JsonParser 包含使用流模型解析JSON数据的方法JsonGenerator包含输出JSON数据到一个输出源的方法。
表格2展示了流API中主要的类和接口

表格 2. 流API中主要的类

类或接口 描述
Json 包含创建JSON解析器,生成器,和工厂对象的静态方法。
JsonParser 表示一个基于事件的解析器,可以从流中读取JSON数据。
JsonGenerator 每次一个值将JSON数据写出到流中

JsonParser提供了先锋,使用pull 解析对象模型,访问只读的JSON数据。在这个模型中,应用程序代码在解析器接口中,控制线程和方法调用,来使解析器向前移动或者从当前解析器的状态获得JSON数据。

JsonGenerator提供了将JSON数据写入流的方法。生成器可以在JSON对象中写入名/值对,在JSON数组中写入值。

流API是一个低级的API,它被设计用来更效率的处理大量的JSON数据。其他的JSON框架(例如JSON binding) 通过使用API可以继承(implement)。

让我们使用流API来做一下刚才使用对象模型API做过的事情。搜索Facebook的关于JAVA的岗位。
在列表4中,
第1-3行创建了一个流的解析器,
第4-5行取得了下一个事件
第6行寻找KEY_NAME这个事件,
第8到11行读取名字并打印它们,
第14-16行读取职位并输出他们。
当使用对象模型API比较相同的工作,流API提供了一种有效的方式存取名字和职位。

 1 URL url = new URL("https://graph.facebook.com/search?q=java&type=post");
 2 try (InputStream is = url.openStream();
 3      JsonParser parser = Json.createParser(is)) {
 4     while (parser.hasNext()) {
 5         Event e = parser.next();
 6         if (e == Event.KEY_NAME) {
 7             switch (parser.getString()) {
 8                 case "name":
 9                     parser.next();
10                    System.out.print(parser.getString());
11                    System.out.print(": ");
12                    break;
13                case "message":
14                    parser.next();
15                    System.out.println(parser.getString());
16                    System.out.println("---------");
17                    break;
18             }
19         }
20     }
21 }

列表 4. 使用流API处理Facebook的岗位信息

结论

处理JSON的Java API提供了如下功能:

  • 将输入流解析为不可变的对象或事件流
  • 将事件流或不可变对象写入输出流中
  • 编程操作不可变对象
  • 使用builders编程构建不可变对象

构建数据绑定,转换,查询或其他的操作API基础。JAX-RS 2.0 提供了原始整合为处理JSON的JAVA API。

时间: 2025-01-21 08:46:54

处理JSON的Java API :JSON的简介的相关文章

如何使用Json实现Java和C的#沟通和通信

我们在项目里经常要涉及到各模块间的通信,这其中又不可避免要碰到各类语言间之间的通信,比如之前做的一个项目里面就是Java发的消息需要C#接收,(具体消息是怎么传输的可以使用RabbitMQ等,关于RabbitMQ的使用总结可以看我之前的博客),都是面向对象的语言,而面向对象的消息怎么反解析到C#是个难题.下面就是使用Json密器让Java和C#沟通的具体办法的总结. 摘要:Json是Java和C#之间通信的利器,Java端将Java对象转变为Json串后发出,C#端接收到Json串后转换为C#对

GSON解析 json转java对象问题

问题描述 GSON解析 json转java对象问题 使用Gson将JSONObject objectObj 对象转换为Charge对象部分代码: Gson gs = new GsonBuilder().setDateFormat("yyyy-MM-dd").create(); Charge charge = gs.fromJson(objectObj.toString(), Charge.class); 问题是结果charge与objectObj结构一致但是某些字段的值不一样了!!!

JSON 介绍(Introducing JSON)

介绍 JSON العربية Български 中文 Český Dansk Nederlands English Esperanto Français Deutsch Ελληνικά עברית Magyar Indonesia Italiano 日本 한국어 فارسی Polski Português Română Русский Српско-хрватски Slovenščina Español Svenska Türkçe Tiếng Việt ECMA-404 The JS

DB2 NoSQL JSON 功能(三) 使用 Java API 编写应用程序

管理 JSON 文档 - 使用事务和不使用事务 概述 简介 DB2 JSON 是一个可用于 DB2 Linux, Unix and Windows 10.5 的 Technology Preview,提供了以下特性: 一个命令行 shell 用于管理和查询 JSON 数据 一个 Java API 用于应用程序开发 一个有线监听器用于接受和响应通过网络发送的请求. 图 1. DB2 JSON 组件 本文将介绍如何使用 Java 接口管理和查询 DB2 JSON 文档存储中的 JSON 文档.还将讨

JSON简介及Java转换JSON的方法

本文主要讲述如下几个内容: 1.JSON定义以及JSON的特性 2.如何在JavaScript中解释JSON格式数据 3.如何在Java代码中使用JSON(讲对象转换成JSON对象以及解释JSON字符串) 一.JSON w3c上对JSON有比较详细的介绍,链接http://www.w3school.com.cn/json/index.asp.下面仅讲述重要的几点. Json是 JavaScript 对象表示法(JavaScript Object Notation),是轻量级的文本数据交换格式,具

Java:JSON解析工具-org.json

一.简介  org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类,现在就各个类的使用解释如下.  二.准备  1.在使用org.json之前,我们应该先从该网址https://github.com/douglascrockford/JSON-java下载org.json源码,并将源码其加入到Eclipse中,即可调用.  2.查看相关的API文档,访问:https://github.com/douglascrockford/JSON-java. 

有效选择七个关于 Java 的 JSON 开源类库

有效选择七个关于Java的JSON开源类库 April 4, 2014 By Constantin Marian Alin 翻译:无若 简介 JSON是JavaScript Object Notation的缩写,是一种轻量级的数据交换形式,是一种XML的替代方案,而且比XML更小,更快而且更易于解析.因为JSON描述对象的时候使用的是JavaScript语法,它是语言和平台独立的,并且这些年许多JSON的解析器和类库被开发出来.在这篇文章中,我们将会展示7种Java JSON类库.基本上,我们将

在WebSphere Cast Iron中使用JSON(三) 设计基于JSON的REST API

简介 WebSphere Cast Iron(后面简称为 Cast Iron)被广泛用于遍及内部和外部应用程序的集成和迁移.过去,JSON  被普遍用作 REST API 的传输类型,因为与 XML 相比,它的格式是轻量级的. 在 Cast Iron 中,您可以创建和公开一个基于 JSON 的 API,这是一个以 JSON 格式接受请求并发送响应的整合流程.Cast Iron 使用了 XML 和XML 模式.Cast Iron 引入了两个用来处理 JSON 数据的新活动:Read JSON 和

在WebSphere Cast Iron中使用JSON(二) 调用基于JSON的REST API

简介 WebSphere Cast Iron(以下简称 Cast Iron)被广泛用于整个内部和外部应用程序的集成和迁移.过去,大多数基于 SaaS 的应用程序都公开了 REST API,这些 API 用于处理 JSON 数据.然而,Cast Iron 主要处理 XML 和 XML 模式.为了支持有效的 REST API 调用,Cast Iron 引入了两个新活动来处理 JSON 数据. 您可以在调用 REST API (大部分是 SaaS 供应商公开的)的过程中使用 Read JSON 和 W