JSON之HelloWord

一、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开源引擎!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。