一、JSON介绍
声明:文中对JSON的介绍引用了网络上共享的知识,本文的知识也提供给读者分享。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。JSON的格式独立于编程语言,但是也借鉴了许多编程语言的习惯。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。
【JSON语法定义】
JSON用于描述数据结构,其形式如下
- 对象 (Object):一个对象以“{”开始并且以“}”结束。一个对象包含一系列非排序的 名称/值 对,每个 名称/值 对之间使用”,”分区。
- 名称/值(Collection):名称和值之间使用“:”隔开,例如:
{"name":"LiSi", "age":24, "isMarried":false}
一个名称是一个字符串,一个值可以是字符串、数值、对象、布尔值、有序列表和null。
- 有序列表(Array):在一个或者多个值使用“,”进行分区后,使用“[”和“]”将它们括起来就形成了有序列表,例如:
[collection1, collection2]
- 字符串:以双引号括起来的一串字符。
- 数值:一系列0-9的数字组合,可以为负数或者小数。还可以用“e”或者”E”表示指数形式。
- 布尔值:表示为 true 和 false。
【JSON应用领域】
- JSON可用于WEB数据的传输领域。
- 相对于传统的关系型数据库,一些基于文档存储的NoSQL非关系型数据库选择JSON作为其数据存储的格式,比较出名的产品有MongoDB、CouchDB、RavenDB等。
【JSON与其他数据格式的比较】
(一)JSON与XML比较
JSON与XM最大的不同在于XML是一个完整的标记语言,而JSON不是。XML利用标记语言的特性提供了绝佳的延展性,在数据存储、扩展以及高级检索方面比JSON有优势,而JSON则由于比XML更加小巧,以及浏览器的内建快速解析支持,使其能够更适合用于网络数据的传输。
(二)JSON与YAML比较
YAML其实也很轻量级,但是毕竟用的比较少。本人也就是在之前的一个项目中使用到Perl处理文本数据时才使用到。
二、JSON的Java API
JSON毕竟只是一个数据格式,在实际编程中我们需要一种行之有效的方案将内存中的数据与JSON文本进行序列化与反序列化的操作。
在Java领域,开发者已经奉献了许多JSON处理器,有Google提供的gson,还有国内阿里巴巴公司提供的fastjson等。目前,fastjson的使用反馈普遍要比gson要好得多,读者可以自行了解两者的差异。鉴于fastjson有那么大的优势,而且本人一直对国产开源项目抱有崇高的敬意,所以本文注重介绍fastjson的使用。
三、fastjson
【介绍】
fastjson是阿里巴巴公司的工程师开发的一个开源项目,能够完成Java编程中对JSON数据的处理。fastjson有很好的性能,但是缺点是说明文档不够全面和具体。本人利用了一些时间对fastjson的使用做了一些小实践,在此与各位读者分享,有不足之处欢迎指出。
【fastjson源码编译】
读者可以在这个网站 https://github.com/alibaba/fastjson/releases 下载fastjson的源代码,本人使用的源代码版本号是“fastjson-1.1.43”.
本人使用Eclipse作为编译工具。fastjson-1.1.43 使用到了JDK1.88提供的java.time包的支持,所以在编译前需要配置好JDK1.8开发环境。补充一点,java.time包是java8提供的新特性,读者可以自行查阅相关介绍。fastjson-1.1.43还提供了诸如Spring技术的拓展支持,如果你没有对这些技术支持的话编译这些包时会报错。不过这个问题不大,我们只要把报错的包删掉就好。这样,一个简单的fastjson已经编译好了。
【fastjson常用API】
序列化
String jsonString = JSON.toJSONString(obj);
反序列化
VO vo = JSON.parseObject(jsonString, VO.class);
序列化数据写入文件
// 数组 JSONWriter jsonWriter = new JSONWriter(new FileWriter(tmp.json)); jsonWriter.startArray(); jsonWriter.writerValue(obj); ... jsonWriter.endArray(); jsonWriter.close();
【fastjson实践】
首先定义需要转换成JSON格式的对象。注意,bean类一定要提供一个无参的默认构造器,以便支持后续的反序列化操作。
public class TestBean { private int id = 0; private String name = "default"; private String sex = "man"; private long buildTime = 20141022; private boolean check = false; private TestBean reference; // add reference @Override public String toString() { return "{id:"+id+",name:"+name+",sex:"+sex+",buildTime:"+buildTime+ ",check:"+check+",reference:"+ ( (reference == null) ? "null" : reference.toString())+"}"; } public TestBean(){} // 需要提供默认构造器支持反序列化 public TestBean(int id) { setId(id); } public String getName() { return name;} public void setName(String name) { this.name = name;} public String getSex() { return sex;} public void setSex(String sex) { this.sex = sex;} public int getId() { return id;} public void setId(int id) { this.id = id;} public boolean isCheck() { return check; } public void setCheck(boolean check) { this.check = check;} public long getBuildTime() { return buildTime;} public void setBuildTime(long buildTime) { this.buildTime = buildTime; } public TestBean getReference() { return reference;} public void setReference(TestBean reference) {this.reference = reference;} }
(一)序列化一个对象
import com.alibaba.fastjson.JSON; public void HelloFastJson { public static void main(String[] args) { TestBean bean = new TestBean(1); bean.setReference(new TestBean(2)); System.out.println(JSON.toString(bean)); } }
序列化有一个性能指标就是能不能够将引用对象的数据序列化,这个例子可以检测fastjson引擎的这个性能。测试输出为:
{"buildTime":20141022,"check":false,"id":1,"name":"default","reference":{"buildTime":20141022,"check":false,"id":2,"name":"default","sex":"man"},"sex":"man"}
从输出的结果来看,fastjson引擎对对象的序列化支持良好。序列化的时间性能本文不做讨论,但是欢迎读者回复补充。
(二)序列化一个数组
import com.alibaba.fastjson.JSON; public void HelloFastJson { public static void main(String[] args) { TestBean[] beans = { new TestBean(1); new TestBean(2); new TestBean(3); }; System.out.println(JSON.toString(beans)); } }
测试正常。
(三)序列化超大数组并保存到文件中
import java.io.FileWriter; import java.io.IOException; import com.alibaba.fastjson.JSONWriter; public class HelloFastJson { public static void main(String[] args) { try { JSONWriter jsonWriter = new JSONWriter(new FileWriter("tmp.json")); jsonWriter.startArray(); for (int i = 0; i < 1000; i++) { jsonWriter.writeValue(new TestBean(i)); } jsonWriter.endArray(); jsonWriter.close(); } catch (IOException e) { e.printStackTrace(); } } }
包含1000对象的数组被有序的序列化到JSON文件中了。
四、结束语
这次就先对JSON介绍那么多,以后有深入发现我还会与大家一起分享。最后感谢阿里巴巴的工程师贡献了那么好的JSON开源引擎!