JSON學習(一)—— 基礎概念篇

前言

最近去圖書館借書的時候順便看到JSON書,想到之前畢設有接觸過,簡單瞭解了一下,此處做簡單知識記錄。

參考鏈接

書籍:《JSON實戰》

鏈接:

基本概念

JavaScript Object Notation, JS 對象簡譜,一種輕量級的數據交換格式。 使得應用程序可以通過RESTful API等方式在網絡上進行數據通信。【REST:REpresentational State Transfer 表現層狀態轉換 】

對產生(序列化)和讀取(反序列化)的JSON數據,所有的現代編程語言(Java、JavaScript、Ruby、PHP、Python、C#等)和平臺都提供了良好的支持。

爲什麼要用JSON

  1. 背景:
  • 基於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不會執行腳本,以此預防攻擊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章