前言
最近去圖書館借書的時候順便看到JSON書,想到之前畢設有接觸過,簡單瞭解了一下,此處做簡單知識記錄。
參考鏈接
書籍:《JSON實戰》
鏈接:
- http://www.json.org/
- https://www.runoob.com/json/json-intro.html
- https://segmentfault.com/a/1190000010407527
- https://blog.csdn.net/liuying1802028915/article/details/92393193
基本概念
JavaScript Object Notation, JS 對象簡譜,一種輕量級的數據交換格式。 使得應用程序可以通過RESTful API等方式在網絡上進行數據通信。【REST:REpresentational State Transfer 表現層狀態轉換 】
對產生(序列化)和讀取(反序列化)的JSON數據,所有的現代編程語言(Java、JavaScript、Ruby、PHP、Python、C#等)和平臺都提供了良好的支持。
爲什麼要用JSON
- 背景:
-
基於JSON的RESTful API的爆發式增長;
-
JSON基本數據結構的簡潔性;
-
JavaScript日漸流行
2. JSON的特點:
-
具有特定格式的字符串
-
完全獨立於編程語言
-
比XML數據傳輸的有效性高很多
3. JSON與XML
-
JSON非常簡潔,且正在逐步替代XML成爲互聯網上主要的數據交換格式,易於閱讀;
-
與XML相比,JSON對象及其數據成員這一組合更適合面向對象的設計與開發。
-
節省了每個數據元素的開始標籤與結束標籤,文檔小
-
從企業級應用角度看,JSON文檔在網上的傳輸與處理更快,效率更高
4. JSON與JavaScript
JSON 是 JS 對象的字符串表示法,它使用文本表示一個 JS 對象的信息,本質是一個字符串。
-
要實現從JSON字符串轉換爲JS對象,使用 JSON.parse() 方法:
-
要實現從JS對象轉換爲JSON字符串,使用 JSON.stringify() 方法:
JSON語法規則
1. 數據類型
-
名稱-鍵值對:由一個名稱(數據屬性)和一個值組成
-
對象:名稱-值對的無序集合(類Map格式)
-
數組:值的有序集合
{
"info": [
{ "name":"ciery" , "sex":"female" },
{ "name":"lilei" , "addr":"beijing" },
{ "name":"wangming" , "age":20 }
]
}
2. 值類型
JSON值的類型可爲數字、字符串、邏輯值、數組、對象和null
-
數字(整數或浮點數)
{"age":30}
-
字符串(在雙引號中)
{"name":"ciery","sex":"female"}
-
邏輯值(true 或 false)
{ "flag":true }
-
數組(在方括號中)
"sites": [ { "name":"菜鳥教程" , "url":"www.runoob.com" }, { "name":"google" , "url":"www.google.com" }, { "name":"微博" , "url":"www.weibo.com" } ]
-
對象(在花括號中)
"info":{ {"name":"ciery"}, {"sex":"female"} }
-
null
{ "runoob":null }
3. 語法規則
-
數據在名稱/值對中,名稱和值用 : 隔開
-
數據由逗號分隔
-
花括號保存對象
-
方括號保存數組
注意:JSON 不能存儲 Date 對象。使用的時候需要將Date對象轉爲字符串對象。
4. JSON無版本,無註釋,文件類型是".json"
JSON與Java
Java中存在多個不錯的JSON類庫,可用於進行JSON的序列化/反序列化操作,如Jackson、Gson、Java SE等
JSON中的對象對應Java中的對象
JSON中的數組對應Java中的List
【Jackson:實現Java和JSON轉換的工具
-
jackson-core
:定義了低級的流式API,包括了JSON處理細節。 -
jackson-annotations
:包含了Jackson的註解。 -
jackson-databind
:實現了對象和JSON之間的轉換,這個包依賴上面兩個包。
】
1. Java對象轉JSON
objectMapping.writeValueAsString(obj)
2. JSON轉Java對象
objectMapping.readValue(str, ojb.class)
3. JSON轉Java數組
objectMapping.readValue(str, new List<>)
4. 注意點:
-
java對象中屬性若爲private,則需要顯示生成getter/setter方法;若屬性爲public,則可以不必寫getter/setter方法
-
java對象如果有自定義的構造方法,json字符串轉換爲java對象時會出錯
-
如果json字符串中的屬性個數小於java對象中的屬性個數,可以順利轉換,java中多的那個屬性爲null
-
如果json字符串中出現java對象中沒有的屬性,則在將json轉換爲java對象時會報錯:Unrecognized field, not marked as ignorable,解決方法:在目標對象的類級別上添加註解:
@JsonIgnoreProperties(ignoreUnknown = true)
;
JSON中的安全問題
在web中使用JSON時常出現兩個安全問題:跨站請求僞造和跨站腳本攻擊
1. 前者CSRF是一種利用站點對用戶瀏覽器的信任而發起攻擊的方式。這個信任其實就是用戶的登錄憑證,黑客爲了得到用戶的憑證,會在用戶登錄站點的情況下向用戶發送大量的僞造“消息提醒”,目的就是爲了讓用戶點擊它,訪問它帶有危險腳本的網站。一旦用戶點擊這一消息提醒、訪問該惡意網站,黑客就可獲取用戶的敏感信息(登錄憑證)實現攻擊
解決方法:將數組作爲一個值存入JSON對象,並且禁止GET請求,只允許POST請求,這樣黑客就無法使用腳本的URL
2. 後者XSS通常發生在Javascript從服務器獲取到一段JSON字符串並將其轉化成JavaScript對象的時候,由於eval函數會支持腳本的原始意義,可能會導致不可估計的損失,如eval一個alter語句或者其他都會被有效執行
解決方法:將傳入的字符串使用 JSON.parse() 轉爲JS對象,如此僅解析JSON不會執行腳本,以此預防攻擊