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

时间: 2024-10-03 14:46:18

JSON之HelloWord的相关文章

EJB远程接口调用

一.EJB简介 EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序.简单来说就是把已经编写好的程序(即:类)打包放在服务器上执行.凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台.EJB (Enterprise JavaBean)是J2EE(javaEE)的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准.其特点包括网络服务支持和核心开发工具(SDK). 在J2EE里,Enterprise Java Beans(EJB)称为J

thrift学习笔记(一) thrift简介及第一个helloword程序

简介 facebook开源的RPC框架,秉承了Facebook一贯的只管拉屎不管擦屁股的作风. Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 等等编程语言间无缝结合的.高效的服务. Thrift最初由facebook开

SpringMVC简单构造restful, 并返回json

文章要要点: 快速搭建构造restful的StringMvc GET, POST , PUT , DELETE的各种调用 同一资源 多种表述 (ContentNegotiatingViewResolver解析器),既可以返回对象给JSP, 也可以返回JSON 快速搭建构造restful的StringMvc 首现搭建一个简单的restfulMvc框架,  并上配置文件, 后期会增加带JSON返回值的配置 JAR包 web.xml配置 ? 1 2 3 4 5 6 7 8 9 10 11 12 13

Day4 - 迭代器&amp;生成器、装饰器、Json &amp; pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青

Node.js 使用angularjs取得Nodejs http服务端返回的JSON数组示例

server.js代码: // 内置http模块,提供了http服务器和客户端功能(path模块也是内置模块,而mime是附加模块) var http=require("http"); // 创建服务器,创建HTTP服务器要调用http.createServer()函数,它只有一个参数,是个回调函数,服务器每次收到http请求后都会调用这个回调函数.服务器每收到一条http请求,都会用新的request和response对象触发请求函数. var server=http.createS

npm5 packag-lock.json

前几天升级了 Node.js v8.0 后,自带的 npm 也升级到了5.0,第一次使用的时候确实惊艳到了:原本重新安装一次模块要十几秒到事情,现在一秒多就搞定了.先不要激动,现在我来大概讲一下 npm 5 的一些大的变化: 使用npm install xxx命令安装模块时,不再需要--save选项,会自动将模块依赖信息保存到 package.json 文件: 安装模块操作(改变 node_modules 文件夹内容)会生成或更新 package-lock.json 文件 发布的模块不会包含 p

JS高程3:JSON

JSON,JavaScript Object Notation,JS对象表示法,是目前最常见的结构化数据传输形式. JSON并非编程语言,而是一种数据结构,像mp4.avi一样,只是一种数据格式而已.(数据结构可以包含很多数据类型) JSON值的类型 简单值 对象 数组 简单值:字符串.数字.布尔值和null,注意不包括undefined. 注意:JSON中的字符串必须用双引号. 对象:对象就是无序的键值对,而键值中的值也可以是简单值.对象或者数组. 注意:JSON中对象的属性必须用双引号括起来

C#如何拿到从http上返回JSON数据?

在实际开发中,我们经常会使用到API,所谓API一般就是一个地址,我们称之为接口.然后我们通过用C#对这地址发送请求,请求后,服务器就会给我们返回数据,一般是XML或者JSON,这里我们主要讲述的是JSON. 为了演示,我们这里准备了一个接口,这是一个查询物流的接口.(读者读到这篇文章的时候,接口可能有效,也可能失效,因为接口是网上找的,不是笔者自己写的,但是原理是一样的.) 接口:  http://www.kuaidi100.com/query?type=快递公司编码&postid=物流单号

JSON 简介

ylbtech-JSON: JSON 简介 JSON:JavaScript Object Notation(JavaScript 对象表示法) JSON是存储和交换文本信息的语法,类似 XML. JSON 比 XML 更小.更快.更易解析. JSON 实例 { "employee":[ {"firstName":"John","lastName":"Doe"}, {"firstName"