写在前面的话:

本文以 阿里 开源 JSON解析库 fastjson 进行演示及讲解。为什么要把这个写在文章最前面呢?因为之前在查看很多博客时,博主都没有说明工具类出处。这就导致了我拿着 fastjson 的 类 去调 另一个 Jackson

java实体类加注解将数组转成json java 数组转jsonarray_JSONObject

fastjson简介

内容引自 fastjson 新手指南

fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。比较牛的是下面这句话👇

fastjson 相对其他 JSON 库的特点是快,从 2011 年 fastjson 发布1.1.x版本之后,其性能从未被其他 Java 实现的 JSON 库超越

附上其 maven

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.61</version>
</dependency>



1 什么是 JSON

在最开始接触 JSON 的时候,不太明白 JSON 的概念,感觉很笼统
其实 JSON 就是一种轻量级的数据交换格式,被广泛应用于 WEB



1.1 JSON 的优势

  • JSON简洁 和 清晰的层次结构
  • 易于人阅读和编写,同时也易于机器解析和生成
  • 有效的提升网络传输效率
  • 支持多种语言,很多流行的语言都对 JSON


1.2 JSON 对象

这就是一个平常使用的 JSON

{
	"area": "山东菏泽",
	"name": "马马马马马百万",
	"age": 25
}



1.3 JSON 数组

JSON 数组其实就是包含了多个 JSON

[{
	"area": "山东菏泽",
	"name": "马马马马马百万",
	"age": 25
}, {
	"area": "河南周口",
	"name": "马龙台",
	"age": 26
}]

JSON 数组并一定是要相同的 JSON 对象的集合,也可以是不同的对象,不过我在开发过程中并没有这么使用过,感觉挺别扭的。因为如果将多个对象放进一个 JSONArray



下面 👇 这种类型也是正确的 JSON

[{
	"area": "山东菏泽",
	"name": "马马马马马百万",
	"age": 25
}, {
	"drugCode": "HXUDP000000000000MED0000342809",
	"dosformName": "注射剂",
	"drugName": "盐酸丁卡因注射液"
}]



1.4 JSON、JSON对象、JSON数组区别

JSON 呢只是一种宏观上的叫法,可以理解为是一种数据结构,就像 xml 结构一样,是一种规约性内容;而 JSON 对象则是对 JSON 的具体体现;JSON 数组则是将多个 JSON 对象进行存储的一个集合,可以想象成 Java 中的 ListObject



2 什么是 JSONObject

JSONObject 是根据 JSON 形式在 Java 中存在的对象映射
各大 JSON 类库的 JSONObject 内部实现也是不太一样的。这里以 fastjson

public class JSONObject extends JSON implements Map<String, Object>, Cloneable, Serializable, InvocationHandler {

    private static final long         serialVersionUID         = 1L;
    private static final int          DEFAULT_INITIAL_CAPACITY = 16;

    private final Map<String, Object> map;

    public JSONObject(){
        this(DEFAULT_INITIAL_CAPACITY, false);
    }

    public JSONObject(Map<String, Object> map){
        if (map == null) {
            throw new IllegalArgumentException("map is null.");
        }
        this.map = map;
    }
    // 。。。。省略其余内容
}

可以看到 就是对 HashMap



其使用方式和 HashMap

JSONObject person = new JSONObject();
person.put("name", "马马马马马百万");
person.put("age", 25);
person.put("area", "山东菏泽");

JSONObject drug = new JSONObject();
drug.put("drugName", "盐酸丁卡因注射液");
drug.put("drugCode", "HXUDP000000000000MED0000342809");
drug.put("dosformName", "注射剂");



3 什么是 JSONArray

其实刚才拿 ListObject

仅针对于 fastjson



存放数据的容器就是一个 List 的类型,默认创建为 ArrayList

public class JSONArray extends JSON implements List<Object>, Cloneable, RandomAccess, Serializable {

    private static final long  serialVersionUID = 1L;
    private final List<Object> list;
    protected transient Object relatedArray;
    protected transient Type   componentType;

    public JSONArray(){
        this.list = new ArrayList<Object>();
    }

    public JSONArray(List<Object> list){
        this.list = list;
    }

    public JSONArray(int initialCapacity){
        this.list = new ArrayList<Object>(initialCapacity);
    }
    // 。。。省略余下部分
}



JSONArray

内心独白:不就是一个 List 中 套了个 Map

JSONObject person = new JSONObject();
person.put("name", "马马马马马百万");

JSONObject drug = new JSONObject();
drug.put("drugName", "盐酸丁卡因注射液");

JSONArray array = new JSONArray();
array.add(person);
array.add(drug);



4 Fastjson 的简单应用

4.1 将对象转换为json字符串

import com.alibaba.fastjson.JSON;

String jsonStr = JSON.toJSONString(person);



4.2 将json字符串转换为JSONObject对象

JSONObject jsonObject = JSON.parseObject(jsonStr);



4.3 将JSONObject 转换为对象

JSONObject person = new JSONObject();
person.put("name", "马马马马马百万");
person.put("age", 25);

Student stuObj = JSON.toJavaObject(person, Student.class);



5 结束语

上述文章中并没有涉及到复杂 JSON 对象,只是为了前期理解没有举例
下述 JSON 中涉及到了 数值、字符串、内置 JSON

{
	"article": {
		"row": 1024,
		"lastUpdateTime": "2019-12-13 19:27:59",
		"Title": "Java 中 JSONArray 与 JSONObject 详细介绍结构及应用",
		"images": {
			"Url": "http://www.images.com",
			"Height": 256,
			"Width": "256"
		},
		"sections": [17, 18, 19, 20]
	}
}



5.1 关于 JSON格式化

JSON解析及格式化个性网站 | 可以解析JSON及XML字符串的网站



5.2 关于 JSON 类库项目地址



Json-lib | Gson | Jackson | FastJson


5.3 关于性能测试

性能测试的话可以在网上找些文章或者自己来验证下,可以从不同的类型、数量多少等多维度测试