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

  • 相关阅读:
    salt+jenkins+gitlab+ecs构建公司部署平台
    解决openstack实例主机名后缀问题
    测试CentOS-7-x86_64-Minimal-1708.iso这种光盘安装效果
    dbca建库--linux上使用vnc图形化安装oracle10g版本
    使用mediainfo工具统计每个视频文件(媒体文件)播放时长
    rsync命令简单用法介绍
    winscp工具和xshell连接linux机器时切换到root账户
    zabbix和iptables的nat表结合使用
    adb和机顶盒一些常识
    VirtualBox虚拟机禁止时间同步
  • 原文地址:https://www.cnblogs.com/chenshi/p/4049684.html
Copyright © 2020-2023  润新知