程式設計師:JSON、JSONObject 與 JSONArray 簡單講解

2021-01-07 程序猿的內心獨白

前言

JSON是網際網路開發過程中應用最廣泛的一種數據類型,不管是後端API接口中,還是在前端都能得到廣泛應用。

今天就給大家介紹一下JSON的幾種數據類型結構 。

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 對象,特徵就是多個屬性是被 {} 括起來的

{

"area": "山東菏澤",

"name": "馬馬馬馬馬百萬",

"age": 25

}

JSON 數組

JSON 數組其實就是包含了多個 JSON 對象的一個集合,數組是以 數組括號 [] 括起來的

[{

"area": "廣東",

"name": "山溪",

"age": 25

}, {

"area": "沙西",

"name": "馬希泰",

"age": 26

}]

JSON 數組並一定是要相同的 JSON 對象的集合,也可以是不同的對象,不過我在開發過程中並沒有這麼使用過,感覺挺彆扭的。因為如果將多個對象放進一個 JSONArray 中的話,下意識認為是相同類型的集合

下面這種類型也是正確的 JSON 數組格式

[{

"area": "江蘇",

"name": "徐州",

"age": 25

}, {

"drugCode": "HXUDP000000000000MED0000342809",

"dosformName": "注射",

"drugName": "打點滴"

}]

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", "馬馬馬馬馬百萬");

person.put("age", 25);

person.put("area", "山東菏澤");

JSONObject drug = new JSONObject();

drug.put("drugName", "鹽酸丁卡因注射液");

drug.put("drugCode", "HXUDP000000000000MED0000342809");

drug.put("dosformName", "注射劑");

什麼是 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 的平常使用方法

內心獨白:不就是一個 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", "馬馬馬馬馬百萬");

person.put("age", 25);

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

結束語

上述文章中並沒有涉及到複雜 JSON 對象,只是為了前期理解沒有舉例

下述 JSON 中涉及到了 數值、字符串、內置 JSON 對象、數組

{

"article": {

"row": 1024,

"lastUpdateTime": "2019-12-13 19:27:59",

"Title": "Java 中 JSONArray 與 JSONObject 詳細介紹結構及應用",

"images": {

"Url": "",

"Height": 256,

"Width": "256"

},

"sections": [17, 18, 19, 20]

}

}

關於 JSON格式化 相關的網站

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

關於 JSON 類庫項目地址

Json-lib | Gson | Jackson | FastJson

關於性能測試

性能測試的話可以在網上找些文章或者自己來驗證下,可以從不同的類型、數量多少等多維度測試

相關焦點

  • json for modern c++的使用
    很多高級語言如python等都對json有良好的支持,方便程式設計師的使用。然而C++對json沒有很好的內置支持,因此往往要引用一些第三方庫。而網上很多json的包,形形色色種類繁多,但是要麼功能不夠強大,要麼難以使用。
  • python解析json方法
    東西很簡單,大家一起來學一學。一、Json簡介 JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。例如下面這樣:{"b": "Hello", "c": null, "a": true}它的值可以是雙引號括起來的字符串(string)、數值(number)、true、false、 null、對象(object)或者數組(array)。這些結構可以嵌套。
  • 自己寫的一個 json parser
    json這種數據格式,應該算是人人皆知的了,其語法規則不必贅述。我想藉助編寫一份json parser來講解語法解析,通過實踐來學習。簡單來說,parser就是個轉換器,輸入是一個字符串,而輸出是一個你自己定義一個數據結構。
  • 半小時掌握Python的JSON模塊
    表1 JSON類型轉換Python類型的對應關係JSON類型Python類型對象(object)字典(dict)數組(array)列表(list)字符串(string)字符串(str)整數(number(int))整數(int)實數(
  • (實用篇)PHP JSON數組與對象的理解
    因此,前後端相關人員先對PHP的json_encode函數原理有必要的了解是最重要的一個環節。PHP中的array是個萬能的數據結構,並不像其它語言根據需要的場景會定義很多約束性的數據類型來描述結構,所以PHP程式設計師是很難給客戶端人員講清楚返回的是什麼結構的數據的。也就變成明明是通過PHP的數組數據編碼成json的,但輸出值有時是數組、有時是對象的情況。
  • 使用JSONObject生成和解析json
    作者:joahyau連結:www.cnblogs.com/joahyau1. json數據類型json
  • 程式設計師都應該了解的一種數據格式之 JSON
    因為大多數的時候大家用的JSON可能都是上面那種key-value形式,所以很多人在講解JSON的時候總是會忽略數組形式,這一點是需要注意的。那JSON的數組形式是怎麼樣的呢?舉一個實例吧!["pig", 18, "man", "江西省撫州市崇仁縣"]數組形式的JSON數據就是值(value)的有序集合。
  • Python處理json總結
    JSON最常用的格式是對象的鍵值對:key只能是string, value可以是 object、array、string、number、true/false、null{"sites": [{ "name":"360" , "url":"www.360.com" }, { "name":"google"
  • Python入門進階教程-JSON操作
    JSON數據類型當程序把 JSON 對象或 JSON 字符串轉換成 Python 對象時,從 JSON 類型到 Python 類型的轉換關係如下所示:JSON類型Python類型JSON 類型Python 類型對象(object)字典(dict)數組(array列表(list)字符串(string)
  • json其實不難,只需了解一點,就能輕鬆玩轉它
    工作過程中,經常需要使用json這種輕量級的數據交換格式,例如,通過它可以組織數據保存到配置文件,客戶端和服務端通過json格式來進行通信等,但是,針對特定的需求場景,需要設計怎樣的json格式比較合適呢,json到底可以支持多少種格式呢,有沒有一種簡單的概括,就能讓使用者輕鬆使用它呢!
  • 如何再Apache Hive中解析 Json數組
    從內置的 UDF 可以看到兩個用於解析 Json的函數:get_json_object 和 json_tuple。', 'name');注意:json_tuple 相對於 get_json_object 的優勢就是一次可以解析多個 Json 欄位。
  • Java解析json的一些操作
    對象的使用方法在引入了fastjson的包之後,能夠得到一種類「 JSONObject」,實例化之後稱為json對象JSONObject object = JSONObject.parseObject({\"boolean\":true,\"string\":\"string\",\"list\":[1,2,3],\"int\":2}"); //string
  • 數據類型和Json格式
    我恍然大悟,數據構成的最小單位原來如此簡單!難怪在程式語言中,只要有了數組(array)和對象(object)就能夠儲存一切數據了。我馬上想到了json。21世紀初,Douglas Crockford尋找一種簡便的數據交換格式,能夠在伺服器之間交換數據。
  • PHP json_encode() 函數介紹
    這個函數的功能是將數值轉換成json數據存儲格式。04          'Name'=>'希亞',08$jsonencode = json_encode($arr);程序運行結果如下:json_encode 函數中中文被編碼成 null 了,Google 了一下,很簡單,為了與前端緊密結合,Json 只支持 utf-8 編碼,我認為是前端的 Javascript 也是 utf-8 的原因。
  • json簡介
    json的書寫格式json語法很簡單,也很容易理解,具體如下:語法規則:數據在名稱/值對中數據由逗號分隔花括號保存對象方括號保存數組JSON 值:數字(整數或浮點數)字符串(在雙引號中)邏輯值(true 或 false)數組(在方括號中)對象(在花括號中)nullJSON 名稱/值對名稱/值對包括欄位名稱(在雙引號中),後面寫一個冒號
  • JSON詳解
    例如:var comStr = 'this is string';        json字符串:指的是符合json格式要求的js字符串。例如:var jsonStr = "{StudentID:'100',Name:'tmac',Hometown:'usa'}";        json對象:指符合json格式要求的js對象。
  • List 和 Map、JSONArray、Array 互轉
    CollectionUtils.isEmpty(userList)) { return new JSONArray(); } return JSONArray.parseArray(JSON.toJSONString(userList));}五 JSONArray 轉 Listpublic static List<User> jsonArrayToList
  • 詭異 | Spark使用get_json_object函數
    一、問題現象:使用spark sql調用get_json_object函數後,報如下錯誤:yarn 容器被
  • PHP中JSON的應用
    很簡單,兩個函數:json_encode和json_decode(跟序列化很像啦)。一個編碼,一個解碼。>   很簡單的將一個數組JSON了。 = json_encode($arr);   $obj = json_decode($json_string
  • 用 Python 操作 JSON 類型數據詳解
    indent:表示縮進,可以是數據格式可讀性更強,格式化輸出JSON字符串,如果ident是一個非負的整數,那麼JSONarray元素和object成員將會被以相應的縮進級別進行列印輸出。使用json模塊的json.load()函數,將JSON格式的字符串轉換成Python對象,使用的語法格式如下:import jsonjson.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook