【國慶の禮物 之二】洛谷P1017 進位制轉換
網路資料傳輸
計算機網路通訊本質就是相互傳輸資料,而傳輸資料就涉及到資料儲存格式。所謂資料儲存格式就是將資料先按照一定的格式儲存,然後再傳輸到網路的另一端。另一端接收到資料後,就可以按照儲存的格式將資料解析出來。
常見的兩種網路資料儲存格式
- XML 格式
- JSON 格式
XML 格式
曾經有一段時間,XML 是網際網路上傳輸結構化資料的事實標準;Web 服務的第一次浪潮很大程度上都是建立在XML之上的,突出的特點是伺服器與伺服器間通訊。但是業界一直不乏質疑 XML 的聲音。不少人認為 XML 過於煩瑣、冗長。
舉例:
<?xml version="1.0" encoding=“UTF-8"?> <books> <book> <isbn>1</isbn> <title>Title of 1</title> <author>Author of 1</author> </book> <book> <isbn>3</isbn> <title>Title of 3</title> <author>Author of 3</author> </book> </books>
XML 格式儲存資料的特點是跨程式語言、資料傳輸效率低(已過時)
JSON 格式
-
JSON 是 JavaScript的一個嚴格的子集,利用了 JavaScript 中的一些模式來表示結構化資料。JSON 是在 JavaScript 中讀寫結構化資料的更好的方式
-
JSON 是一種資料格式,不是一種程式語言。雖然具有相同的語法形式,但JSON 並不從屬於JavaScript
舉例:
[ { isbn:1, title:“Title of 1”, author:“Author of 1” }, { isbn:3, title:“Title of 3”, author:“Author of 3” } ]
JSON 格式儲存資料的特點是跨程式語言、資料傳輸效率高(主流)
JSON 語法
JSON 的語法可以表示三種資料型別
- 簡單值:使用與JS相同的語法,可以在 JSON 中表示字串、數值、布林值和null(JSON不支援JS中特殊值undefined)
- 物件:物件作為一種複雜資料型別,表示的是一組無序的鍵值對;每個鍵值對中的值可以是簡單值,也可以是複雜資料型別的值
- 陣列:陣列也是一種複雜資料型別,表示一組有序的值的列表,可以通過數值索引來訪問其中的值。陣列的值也可以是簡單值、物件或陣列
簡單值
JSON 簡單值等價於 Java 的基本資料型別
舉例:
5 # 數值 true # 布林值 "hello,world!" # 字串 null # 空值
- JSON字串與 JS 字串的最大區別在於,JSON字串必須使用雙引號(單引號會導致語法錯誤)
- 布林值和 null 也是有效的 JSON 形式
- 在實際應用中,JSON 更多地用來表示更復雜的資料結構,而簡單值只是整個資料結構中的一部分
JSON 物件
JSON 物件等價於 Java 物件,使用大括號 { }
表示物件
舉例:
{
name:“張三”,
age: 24,
gender:“男”
}
與 JS 的物件字面量相比,JSON 物件有三個地方不一樣
- 沒有申明變數(JSON中沒有變數的概念)
- 沒有末尾的分號
- 物件可以巢狀物件
物件巢狀舉例:
{
"name" : "張三",
"age" : 29,
"school": {
"name": "成都一中",
"location": "人民中路三段38號"
}
}
物件屬性值可以是簡單值,也可以是物件
JSON 陣列
JSON 陣列等價於 Java 陣列,使用 []
表示陣列
舉例:
[25,"Hi", 14.5, true ]
JSON陣列採用的是JS中的陣列字面量形式
- JSON 陣列沒有變數和分號
- 把陣列和物件結合起來,可以構成更復雜的資料集合
複雜陣列舉例:
[
{
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
“edition”: 3,
“year”: 2011
},
{
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
“edition”: 2,
“year”: 2009
}
]
JSON 與 Java 物件相互轉換
Java:
public class Person {
private String name;
private int age;
private String gender;
private Contact contact;
}
public class Contact {
private String phone;
private String email;
private String qq;
private String msn;
}
JSON:
{
name:“張三”,
age: 24,
gender:“男”,
contact:{
phone:“13541335229”,
email:[email protected],
qq:26842234
msn:zhangsan2021
}
}
JSON 解析與序列化
JSON 解析與序列化類似於 Java 的序列化和反序列化
JSON 之所以流行,擁有與 JS 類似的語法並不是全部原因。更重要的一個原因是,可以把JSON 資料結構解析為有用的 JS 物件(與 XML 資料結構要解析成 DOM 文件而且從中提取資料極為麻煩相比,JSON 可以解析為 JS 物件的優勢極其明顯)
JS中包含一個全域性物件JSON,該物件有兩個方法
- stringify( ) :用於把 JS 物件序列化為 JSON 字串
- parse( ):用於把 JSON 字串解析為原生 JS 值(反序列化)
舉例:
var book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};
var jsonText = JSON.stringify(book); //序列化物件
var bookCopy = JSON.parse(jsonText); //解析物件(反序列化)
注意:序列化時值為 undefined 的任何屬性會被忽略,結果中最終都是有效資料。如果傳給 JSON.parse() 的字串不是有效的JSON 資料,該方法會丟擲錯誤