1. 程式人生 > 其它 >【國慶の禮物 之二】洛谷P1017 進位制轉換

【國慶の禮物 之二】洛谷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 資料,該方法會丟擲錯誤