聊一聊JSON|JSONObject | JSONArray

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>

什么是 JSON

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

  • JSON 的优势

    • JSON 的简洁 和 清晰的层次结构

    • 易于人阅读和编写,同时也易于机器解析和生成

    • 有效的提升网络传输效率

    • 支持多种语言,很多流行的语言都对 JSON 格式有着很友好的支持

  • JSON 对象

这就是一个平常使用的 JSON 对象,特征就是多个属性是被 {} 括起来的

{
"error": "1000",
"mages": "success",
"code": 200
}
  • JSON 数组
    JSON 数组其实就是包含了多个 JSON 对象的一个集合,数组是以 数组括号 [] 括起来
[{
  "description":"这是一个带参数的post请求,请求参数格式是key:value,不能使用queries,要使用forms",
  "request":{
    "uri":"/postjson",
    "method":"post",
    "json":{
      "name":"codingtest",
      "age":"29"
    }}
}]

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

下面这种类型也是正确的 JSON 数组格式

[{
  "description":"这是一个带参数的post请求,请求参数格式是key:value,不能使用queries,要使用forms",
  "request":{
    "uri":"/postjson",
    "method":"post",
    "json":{
      "name":"codingtest",
      "age":"29"
    }},
  "response":{
    "json":{
      "error":"1000",
      "mages":"success"
    },
    "headers":{
      "Content-Type":"application/json;charset=gbk"
    }
  }
}
]
  • JSON、JSON对象、JSON数组区别
    JSON 呢只是一种宏观上的叫法,可以理解为是一种数据结构,就像 xml 结构一样,是一种规约性内容;而 JSON 对象则是对 JSON 的具体体现;JSON 数组则是将多个 JSON 对象进行存储的一个集合,可以想象成 Java 中的 List 和 Object 的关系

什么是 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", "codingtest");
person.put("age", 29);
person.put("area", "北京");
JSONObject drug = new JSONObject();
drug.put("drugName", "case1");
drug.put("drugCode", "20200508");
drug.put("dosformName", "pass");

什么是 JSONArray

  • 其实刚才拿 List 与 Object 关系举例是有迹可查的
  • 仅针对于 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 的平常使用方法

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);

Fastjson 的简单应用

  • 将对象转换为json字符串
import com.alibaba.fastjson.JSON;
String jsonStr = JSON.toJSONString(person);
  • 将json字符串转换为JSONObject对象
JSONObject jsonObject = JSON.parseObject(jsonStr);
  • 将JSONObject 转换为对象
JSONObject person = new JSONObject();
person.put("name", "codingtest");
person.put("age", 29);

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

结束语

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

{
  "article": {
  "row": 1024,
  "lastUpdateTime": "2020-05-08 18:27:59",
  "Title": "Java 中 JSONArray 与 JSONObject 详细介绍结构及应用",
  "images": {
  "Url": "https://www.jianshu.com/u/acf637a73f52",
  "Height": 500,
  "Width": "500"
  },
  "sections": [110, 120, 119, 114]
  }
}
  • 关于 JSON格式化 相关的网站传送门
  • 关于 JSON 类库项目地址

Json-lib | Gson | Jackson | FastJson


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354