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

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

前言

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

關於性能測試

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

相關焦點

  • c 怎麼發送json數據 - CSDN
    其實解析過程很簡單, 而且只用了強大的ArduinoJson庫的一小部分功能具體操作請參考本文第八節下面是 ArduinoJSON庫的核心內容:一.V6版本函數庫結構可以看出,方法主要分為四大類:JsonDocument相關,這是整個json庫的入口,它負責高效管理內存以及調用json解析器;JsonObject相關;JsonArray相關;
  • Springmvc框架對json的支持 Java程式設計師必看
    json是一種前後端分離思想所使用的存儲數據的格式,然而使用Springmvc這個框架在對前臺參數處理時會遇到很多坑,下面我們就模擬一下前臺發送json數據看springmvc能否成功接收。但是在寫json的時候還是出現了許多問題,用eclipse寫js代碼經常除了bug卻不知道問題出來哪裡。我們可以使用alert()或console.info()函數來進行判斷問題出在哪一行上。解決了發送json的問題後,又遇到一個bug,發送的json字符串返回的確實一個http415錯誤代碼,大概是說後端接收的參數類型不正確的意思,下面請看java代碼。
  • rpc、json Rpc和http區別
    帶索引數組參數的rpc調用--> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1}<-- {"jsonrpc": "2.0", "result": 19, "id": 1} 2.
  • JSON對象和簡單練習
    JSON對象和簡單練習前面一篇我們查找的圖書的name都是通過逗號隔開,然後拼接成一個字符串傳給瀏覽器。其實我們可以把多個圖書名稱用數組格式傳給瀏覽器,前端JS代碼通過遍歷這個數組,也是可以拿到這些name數據。現在,我們一般不用數組,而是用JSON這格式。
  • 使用Java讀取Json數據和ArrayList刪除全部數據的方法
    如何使用Java讀取Json文件裡邊的數據,Json文件的格式是{name:"龜哥「},所以龜哥的思路是先讀取json文件,然後拿到name對應的屬性值,把讀取到的數據保存到集合中。讀取json文件使用InputStreamReader讀取json文件,將讀取的json文件數據保存到StringBufferm,通過toString方法將文件數據轉化成字符串的形式,然後new 一個JsonObject對象j,將字符串傳入到對象j的構造方法裡邊,比如JsonObject j=new JsonObject(字符串s);通過j.get("name")方法拿到了name的屬性值」龜哥「,
  • 就能學會以太坊 JSON API 基礎知識!
    "headers = {'Content-type': 'application/json'}為了簡單起見,我們使用Infura節點連接到Ethereum Ropsten Testnet。我們可以簡單地做以下操作:# Prepare the data we will senddata = {"jsonrpc": "2.0", "method": "eth_gasPrice", "params": [], "id":1}response = session.post(url, json=data, headers=headers
  • 乾貨|如何利用Python處理JSON格式的數據,建議收藏!
    和pickle兩個json模塊和pickle都提供了四個方法:dumps, dump, loads, load序列化:將python的數據轉換為json格式的字符串反序列化:將json格式的字符串轉換成python的數據類型序列化首先我們來看一下序列化是如何操作的,我們首先用json.dump()將字典寫入json格式的文件中能夠進行類似操作的則是
  • Golang 語言使用標準庫 net/rpc/jsonrpc 包跨語言遠程調用
    ,它支持JSON-RPC 1.0,通過 json 格式傳輸數據。02Go 語言 net/rpc/jsonrpc 標準庫jsonrpc 是基於 TCP 協議,不支持 HTTP 協議。jsonrpc 採用 JSON 編解碼傳輸數據,而不是採用 gob 編解碼方式。
  • MySQL全文索引、聯合索引、like查詢、json查詢速度大比拼
    查詢背景有一個表tmp_test_course大概有10萬條記錄,然後有個json欄位叫outline,存了一對多關係(保存了多個編碼,例如jy1577683381775)我們需要在這10萬條數據中檢索特定類型的數據
  • 用Java創建一個有序的JSONObject
    但是,這是我使用的一項要求org.json.JSONObject,因此我決心為這種JSON對象找到解決方案。當訂單遵循索引時,JSONArrays可能會為您提供所需的解決方案。一個可能的解決方案是實現自己的JSONObject。您可以使用LinkedHashMap <>()或其他有序的數據結構,而不是使用HashMap <>()這樣做。
  • wind-core 4.0.4 發布,支持將對象映射為 JSON 字符串
    新增:添加對象到JSON轉換器,現在對象/集合對象 可以直接保存為JSON字符串了 @TableColumn(columnDefinition = "text", comment = "對象集合轉存json,可指定集合類型")@TypeHandler(ObjectCollectionToJsonTypeHandler.class)private List<Type
  • 「每日github」6:restful接口mock工具:json-server|K8s上榜等
    宣傳的目標是使react應用更簡單。2,moment / momentmoment.js是一個JavaScript的時間日期處理類庫。這個庫還是相當好用的,各種時間日期顯示操作功能齊全,且有多語言支持。這個庫建議大家收藏,你必然會用到的,到時候不需要自己重複造輪子。這也是我寫這一些列文章的初衷,避免重複造輪子。
  • (建議收藏)|Spring Boot集成JSON Web Token(JWT)
    1.3.4 jwt的特點因為json的通用性,所以JWT是可以進行跨語言支持的,像JAVA,JavaScript,NodeJS,PHP等很多語言都可以使用。因為有了payload部分,所以JWT可以在自身存儲一些其他業務邏輯所必要的非敏感信息。
  • 用Scala實現簡單的Web和API伺服器
    這篇指南將向你介紹如何利用Scala簡單的HTTP伺服器,來提供Web內容和API。本文還會介紹一個完整的例子,告訴你如何構建簡單的實時聊天網站,同時支持HTML網頁和JSON API端點。這篇文及章的目的是介紹怎樣用Scala實現簡單的HTTP伺服器,從而提供網頁服務,以響應API請求。
  • json結構 裁判文書網_將字典格式攜程json文書 - CSDN
    這個驗證碼的識別還是很簡單的,可以通過識別圖像的方法解決,也可以通過更換IP的方法解決。6.加密算法策略升級比較頻繁這個網站的更新相當頻繁,主要是更新反爬蟲策略。為這個網站編寫爬蟲,要做好長久的分析網站、改寫爬蟲準備,代碼的結構和注釋儘量要方便自己的閱讀。三、獲取列表的詳細步驟1.