Java JSON 解析

JSON 全称 JavaScript Object Notation,中文 JavaScript 对象表示法,JSON 是基于文本的,易于阅读的,语言独立的,轻量级的 数据交换格式

JSON 简介

JSON(JavaScript Object Notation,JS 对象表示法),是一种由 道格拉斯·克罗克福特 构想设计、轻量级的数据交换格式,以文本为基础,且易于让人阅读。尽管 JSON 是 Javascript 的一个子集,但 JSON 是独立于语言的文本格式,并且采用了类似于 C 语言家族的一些习惯。

JSON 数据格式与语言无关,脱胎于 JavaScript,但目前很多编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json,文件扩展名是 .json

JSON 建构于两种结构:

  • 键值对的集合。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组(associative array)。
  • 值的有序列表。在大部分语言中,它被理解为数组(array),在 Java 中,JS 数组表示为 Collection 集合。

这两种结构分别对应 JavaScript 中的 对象数组。注意,JSON 只是一个字符串!是一个纯文本!

  • 对象{k1: v1, k2: v2, ..., kN: vN},key 必须显式得加上双引号
  • 数组[e1, e2, e3, ..., eN],JS 数组其实就是对象,其 key 是隐式的

值(即对象中的 value、数组中的 element)可以是以下类型:

  • null:空指针
  • true/false:布尔值
  • number:数值(十进制)
  • string:字符串(双引号)
  • array:数组
  • object:对象

number 只支持十进制的整数、浮点数。其中浮点数支持科学记数法,即 1.3E4 表示 13000(E 大小写不敏感)。

string 必须使用双引号包围,包括 object 中的 key,这是为了适应 C/C++、Java 中的”单引号为字符,双引号为字符串”语法。此外,还支持一些转义序列:

  • \":双引号
  • \\:反斜杠
  • \/:正斜杠
  • \b:退格符
  • \t:制表符
  • \r:回车符
  • \n:换行符
  • \f:换页符
  • \uhhhh:UTF-16 code-unit

JSON 解析

Java 的 JSON 解析库有很多,如:Gson(谷歌出品)、Jackson、Fastjson(阿里巴巴)、org.json(小巧,简单易用)。本文使用 org.json 解析库。

JSON 官网 中,找到 Java 相关的 JSON 库,第一个就是 JSON-java(即 org.json),点击进入 org.json 的 github 项目地址,然后我们 clone 到本地,使用 javac 编译器编译,最后使用 jar 命令打包即可,细节如下:

org.json 包的 javadoc 文档:http://stleary.github.io/JSON-java/index.html

读取 JSON 数据
org.json.JSONTokener:JSON 词法 token,从 Reader、InputStream、String 中获取 JSON 数据并解析。JSONArray、JSONObject 的构造函数接受该类对象作为参数,用于构造 JSON 对象,便于在内存中操作 JSON 数据。

操作 JSON 数据
org.json.JSONArray:JSON 数组,由方括号包围。getXxx()、optXxx() 方法读取字段,put() 方法修改/添加字段。
org.json.JSONObject:JSON 对象,由花括号包围。getXxx()、optXxx() 方法读取字段,put() 方法修改/添加字段。

保存 JSON 数据
org.json.JSONWriter:将 JSON 数据写入到 Writer 中,链式调用 API。
org.json.JSONStringer:将 JSON 数据导出为 String 字符串,链式调用 API。

简单例子: