# json
- [JSON](#JSON_2)
- [JSON 語法規則](#JSON__4)
- [JSON 名稱/值對](#JSON__10)
- [JSON 值](#JSON__18)
- [基礎結構](#_26)
- [1、對象:](#1_29)
- [2、數組:](#2_31)
- [基礎示例](#_34)
- [其他交換格式](#_100)
- [XML](#XML_101)
- [Protobuf](#Protobuf_105)
- [示例](#_110)
# JSON
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基于ECMAScript的一個子集。 JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習慣(包括C、C++、C#、Java、JavaScript、Perl、Python等)。這些特性使JSON成為理想的數據交換語言。 易于人閱讀和編寫,同時也易于機器解析和生成(一般用于提升網絡傳輸速率)。
## JSON 語法規則
JSON 語法是 JavaScript 對象表示語法的子集。
? 數據在鍵值對中
? 數據由逗號分隔
? 花括號保存對象
? 方括號保存數組
## JSON 名稱/值對
JSON 數據的書寫格式是:名稱/值對。
名稱/值對組合中的名稱寫在前面(在雙引號中),值對寫在后面(同樣在雙引號中),中間用冒號隔開:
`"firstName":"John"`
這很容易理解,等價于這條 JavaScript 語句:
`firstName="John"`
## JSON 值
JSON 值可以是:
數字(整數或浮點數)
字符串(在雙引號中)
邏輯值(true 或 false)
數組(在方括號中)
對象(在花括號中)
null
## 基礎結構
JSON\[1\] 結構有兩種結構
json簡單說就是javascript中的對象和數組,所以這兩種結構就是對象和數組兩種結構,通過這兩種結構可以表示各種復雜的結構。
### 1、對象:
對象在js中表示為“{}”括起來的內容,數據結構為 {key:value,key:value,...}的鍵值對的結構,在面向對象的語言中,key為對象的屬性,value為對應的屬性值,所以很容易理解,取值方法為 對象.key 獲取屬性值,這個屬性值的類型可以是 數字、字符串、數組、對象幾種。
### 2、數組:
數組在js中是中括號“\[\]”括起來的內容,數據結構為 \["java","javascript","vb",...\],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是 數字、字符串、數組、對象幾種。
經過對象、數組2種結構就可以組合成復雜的數據結構了。
## 基礎示例
簡單地說 ,JSON 可以將 JavaScript 對象中表示的一組數據轉換為字符串,然后就可以在函數之間輕松地傳遞這個字符串,或者在異步應用程序中將字符串從 Web 客戶機傳遞給服務器端程序。這個字符串看起來有點兒古怪,但是JavaScript很容易解釋它,而且 JSON 可以表示比"名稱 / 值對"更復雜的結構。例如,可以表示數組和復雜的對象,而不僅僅是鍵和值的簡單列表。
名稱 / 值對
按照最簡單的形式,可以用下面這樣的 JSON 表示"名稱 / 值對":
`{"firstName":"Brett"}`
這個示例非常基本,而且實際上比等效的純文本"名稱 / 值對"占用更多的空間:
`firstName=Brett`
但是,當將多個"名稱 / 值對"串在一起時,JSON 就會體現出它的價值了。首先,可以創建包含多個"名稱 / 值對"的 記錄,比如:
`{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}`
從語法方面來看,這與"名稱 / 值對"相比并沒有很大的優勢,但是在這種情況下 JSON 更容易使用,而且可讀性更好。例如,它明確地表示以上三個值都是同一記錄的一部分;花括號使這些值有了某種聯系。
表示數組
當需要表示一組值時,JSON 不但能夠提高可讀性,而且可以減少復雜性。例如,假設您希望表示一個人名列表。在XML中,需要許多開始標記和結束標記;如果使用典型的名稱 / 值對(就像在本系列前面文章中看到的那種名稱 / 值對),那么必須建立一種專有的數據格式,或者將鍵名稱修改為 person1-firstName這樣的形式。
如果使用 JSON,就只需將多個帶花括號的記錄分組在一起:
```
{
"people":[
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
]
}
```
這不難理解。在這個示例中,只有一個名為 people的變量,值是包含三個條目的數組,每個條目是一個人的記錄,其中包含名、姓和電子郵件地址。上面的示例演示如何用括號將記錄組合成一個值。當然,可以使用相同的語法表示多個值(每個值包含多個記錄):
```
{
"programmers": [{
"firstName": "Brett",
"lastName": "McLaughlin",
"email": "aaaa"
}, {
"firstName": "Jason",
"lastName": "Hunter",
"email": "bbbb"
}, {
"firstName": "Elliotte",
"lastName": "Harold",
"email": "cccc"
}],
"authors": [{
"firstName": "Isaac",
"lastName": "Asimov",
"genre": "sciencefiction"
}, {
"firstName": "Tad",
"lastName": "Williams",
"genre": "fantasy"
}, {
"firstName": "Frank",
"lastName": "Peretti",
"genre": "christianfiction"
}],
"musicians": [{
"firstName": "Eric",
"lastName": "Clapton",
"instrument": "guitar"
}, {
"firstName": "Sergei",
"lastName": "Rachmaninoff",
"instrument": "piano"
}]
}
```
這里最值得注意的是,能夠表示多個值,每個值進而包含多個值。但是還應該注意,在不同的主條目(programmers、authors 和 musicians)之間,記錄中實際的名稱 / 值對可以不一樣。JSON 是完全動態的,允許在 JSON 結構的中間改變表示數據的方式。
# 其他交換格式
## XML
可擴展標記語言,標準通用標記語言的子集,是一種用于標記電子文件使其具有結構性的標記語言。
在電子計算機中,標記指計算機所能理解的信息符號,通過此種標記,計算機之間可以處理包含各種的信息比如文章等。它可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。 它非常適合萬維網傳輸,提供統一的方法來描述和交換獨立于應用程序或供應商的結構化數據。是Internet環境中跨平臺的、依賴于內容的技術,也是當今處理分布式結構信息的有效工具。早在1998年,W3C就發布了XML1.0規范,使用它來簡化Internet的文檔信息傳輸。
中文名 可擴展標記語言 外文名 Extensible Markup Language
## Protobuf
Protocol Buffers是Google公司開發的一種數據描述語言,類似于XML能夠將結構化數據序列化,可用于數據存儲、通信協議等方面。它不依賴于語言和平臺并且可擴展性極強。現階段官方支持C++、JAVA、Python等三種編程語言,但可以找到大量的幾乎涵蓋所有語言的第三方拓展包。
通過它,你可以定義你的數據的結構,并生成基于各種語言的代碼。這些你定義的數據流可以輕松地在傳遞并不破壞你已有的程序。并且你也可以更新這些數據而現有的程序也不會受到任何的影響。
Protocol Buffers經常被簡稱為protobuf。
# 示例
```
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>信息列表</title>
</head>
<body>
<script>
function xhr(url, callback) {
var http = new XMLHttpRequest();
http.open('get', url);
http.onreadystatechange = function() {
if (http.readyState == 4 && http.status == 200) {
callback && callback(JSON.parse(http.responseText));
}
};
http.send(null);
}
xhr('http://node.lintul.com/info/getpage?key=&pi=1&ps=2', function(data) {
console.log(data)
});
</script>
</body>
</html>
```