JSON

JSON

什么是JSON?

JSON(JavaScript Object Notation),是一種輕量級(jí)的數(shù)據(jù)交換格式。非常容易進(jìn)行閱讀和編寫。同時(shí)也方便了機(jī)器進(jìn)行解析和生成
JSON采用完全獨(dú)立于程序語(yǔ)言的文本格式,但是也使用了類C語(yǔ)言的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python, and many others)。這些特性使JSON成為理想的數(shù)據(jù)交換語(yǔ)言。

JSON官網(wǎng)

JSON是建立在兩個(gè)結(jié)構(gòu)之上 :

  • 一個(gè) 鍵/值對(duì)的集合。在不同的編程語(yǔ)言中,這是作為 對(duì)象,記錄、結(jié)構(gòu)、字典、哈希表、列表、或關(guān)聯(lián)數(shù)組來實(shí)現(xiàn)的。
  • 一個(gè)有序的values列表。在大多數(shù)語(yǔ)言中,這是作為一個(gè)數(shù)組、向量、列表或序列來實(shí)現(xiàn)的。

(下面這句話可以不必理解:)
這些都是通用的數(shù)據(jù)結(jié)構(gòu)。幾乎所有的現(xiàn)代編程語(yǔ)言都以一種或另一種形式支持它們。它是有意義的一種數(shù)據(jù)格式,是與編程語(yǔ)言可以互換的基礎(chǔ)。

talk is cheap,show me the code

//成功返回
{
    "statuses": [
        {
            "created_at": "Tue May 31 17:46:55 +0800 2011",
            "id": 11488058246,
            "text": "求關(guān)注。",
            "source": "<a  rel="nofollow">新浪微博</a>",
            "favorited": false,
            "truncated": false,
            "in_reply_to_status_id": "",
            "in_reply_to_user_id": "",
            "in_reply_to_screen_name": "",
            "geo": null,
            "mid": "5612814510546515491",
            "reposts_count": 8,
            "comments_count": 9,
            "annotations": [],
            "user": {
                "id": 1404376560,
                "screen_name": "zaku",
                "name": "zaku",
                "province": "11",
                "city": "5",
                "location": "北京 朝陽(yáng)區(qū)",
                "description": "人生五十年,乃如夢(mèng)如幻;有生斯有死,壯士復(fù)何憾。",
                "url": "http://blog.sina.com.cn/zaku",
                "profile_image_url": "http://tp1.sinaimg.cn/1404376560/50/0/1",
                "domain": "zaku",
                "gender": "m",
                "followers_count": 1204,
                "friends_count": 447,
                "statuses_count": 2908,
                "favourites_count": 0,
                "created_at": "Fri Aug 28 00:00:00 +0800 2009",
                "following": false,
                "allow_all_act_msg": false,
                "remark": "",
                "geo_enabled": true,
                "verified": false,
                "allow_all_comment": true,
                "avatar_large": "http://tp1.sinaimg.cn/1404376560/180/0/1",
                "verified_reason": "",
                "follow_me": false,
                "online_status": 0,
                "bi_followers_count": 215
            }
        },
        ..
    ],
    "previous_cursor": 0,
    "next_cursor": 11488013766,
    "total_number": 50
}

//失敗返回
{
    "request": "/statuses/public_timeline/biz.json",
    "error_code": XXXXX,
    "error": "error message."
}

上述是微博開放平臺(tái)中,找到了其中一個(gè)接口返回的數(shù)據(jù) (數(shù)據(jù)格式j(luò)son) 獲取最新的公共微博。

開放平臺(tái)很多,列舉簡(jiǎn)單的幾個(gè),如下列表:

言歸正傳,讓我們仔細(xì)觀察上面復(fù)雜的json串,我們可以看到許許多多 { },"aaa":"bbb", [ ], 等等,這些又是什么呢? 其實(shí)這都是我們上述介紹過的兩種結(jié)構(gòu)

這兩種結(jié)構(gòu)就是對(duì)象和數(shù)組兩種 結(jié)構(gòu),通過這兩種結(jié)構(gòu)可以表示各種復(fù)雜的結(jié)構(gòu)。

1.對(duì)象(Object)(第一種結(jié)構(gòu))

對(duì)象在 js 中表示為“{}”括起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為 {key:value,key:value,...}的鍵 值對(duì)的結(jié)構(gòu),在面向?qū)ο蟮恼Z(yǔ)言中,key 為對(duì)象的屬性,value 為對(duì)應(yīng)的屬性值,所以 很容易理解,取值方法為 對(duì)象.key 獲取屬性值,這個(gè)屬性值的類型可以是 數(shù)字、 字符串、數(shù)組、對(duì)象幾種。

object軌道圖

上述涉及到一個(gè)關(guān)鍵概念我們暫且叫做: 軌道圖

軌道圖其實(shí)就像我們的交通圖:
我們想象,開著車去一個(gè)地方,我們有多少線路就有多少走法,我們可以在合適的路口,選擇去不同的方向,我只需要轉(zhuǎn)彎處遵守相應(yīng)的規(guī)則,除此之外,我們就不用忌憚什么了,如果你比較閑,甚至可以在某個(gè)環(huán)路上,轉(zhuǎn)圈圈,只需要將我們所說的軌道圖,想象成開車就可以。
下面我們看看上述軌道圖的表示的各種可能性。

    第一種:{}
    第二種:{"ballplayer": "麥迪"}
    當(dāng)然你可以說有很多種,確實(shí)(根據(jù)你自己的喜好,和需求,可以在上述圖的環(huán)形路中隨便轉(zhuǎn)圈)
    第三種:
    {
        "ballplayer": "麥迪",
        "ballplayer2": "科比",
        "ballplayer3": "鄧肯"
        "ballplayer4": "庫(kù)里"
        ...........
        
    }

2.數(shù)組(Array)(第二種結(jié)構(gòu))

數(shù)組在js中是中括號(hào)“[]”括起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為 ["java","javascript","vb",...], 取值方式和所有語(yǔ)言中一樣,使用索引獲取,字段值的類型可以是 數(shù)字、字符串、 數(shù)組、對(duì)象幾種。


array軌道圖

上述軌道圖的表示的各種可能性:

    第一種:{}
    第二種:{"Monday"}
    當(dāng)然你可以說有很多種,確實(shí)(根據(jù)你自己的喜好,和需求,可以在上述圖的環(huán)形路中隨便轉(zhuǎn)圈)
    第三種:
    {
        "Tuesday",
        "Wednesday",
        "Thursday"
        ..........
    }

數(shù)據(jù)類型

value(值)

值(value) 可以是雙引號(hào)括起來的字符串(string)、數(shù)值(number)、true、false、 null、對(duì)象(object)或者數(shù)組(array)。這些結(jié)構(gòu)可以嵌套。


value
string(字符串)

字符串(string) 是由雙引號(hào)包圍的任意數(shù)量 Unicode 字符的集合,使用反斜線 轉(zhuǎn)義。一個(gè)字符(character)即一個(gè)單獨(dú)的字符串(character string)。

string
number(數(shù)據(jù))

數(shù)值(number) 也與 C 或者 Java 的數(shù)值非常相似。只是 JSON 的數(shù)值沒有使用 八進(jìn)制與十六進(jìn)制格式。

number

到此為止Json基本語(yǔ)法規(guī)則就這些了,我們通過這兩種結(jié)構(gòu)進(jìn)行各種嵌套,表示各種復(fù)雜的結(jié)構(gòu)。以滿足我們的需求,對(duì)于初學(xué)者來說,嵌套層次越深,越容易迷惑,下面準(zhǔn)備了一些練習(xí),你可以做一做。想一想。

練習(xí):
1.請(qǐng)分析,并練習(xí)

 {
    "animals": {
        "dog": [
            {
                "name": "wangcai",
                "age": 15
            },
            {
                "name": "Marty",
                "age": null
            }
        ]
    }
 }

 2.有這樣一個(gè)需求,客戶端需要一個(gè)馬刺隊(duì)的現(xiàn)役球員名單,每個(gè)球員需要寫出年齡和姓名,
 及身高信息,數(shù)據(jù)傳輸格式選擇 Json。 請(qǐng)手寫,Json串,并通過在線解析器檢驗(yàn)合法性。

 3. 分析上述例子中的json串信息,或者瀏覽新浪微博開放平臺(tái),找到開放接口,并選擇
 一個(gè)接口,進(jìn)行接口分析。

最后附上一張截圖,待續(xù),謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容