Json簡介

來源:互聯網
上載者:User

標籤:function   第三方   技術分享   cli   gen   pack   one   代碼注釋   intern   

JSON概覽

JSON(JavaScript Object Notation)是一種基於文本的資料交換格式。無論你的應用是用哪種開發語言編寫的(Java/EE,Ruby,PHP,C#/.Net等等),你都可以使用JSON來通過網路進行資料互動和處理。幾乎所有的程式設計語言都有很好的庫或第三方工具來提供基於JSON的API支援,因此你可以非常方便地使用任何自己喜歡的程式設計語言來處理JSON資料。而另一方面隨著REST、像MongoDB這樣的NoSQL技術或標準的廣泛使用,JSON也正成為一種被推薦的資料互動格式。

JSON是在2001年,由Douglas Crockford建立的,並且被IETF(Internet Engineering Task Force)定義為RFC 4627標準,詳請參考:http://tools.ietf.org/html/rfc4627。JSON的媒體類型被定義為 application/json,而檔案的尾碼為.json。

JSON是什麼

JSON是一種簡單資料格式,它有三種資料結構:

  • 索引值對 —— Name/Value (Key/Value)
  • 對象 —— Object
  • 數組 —— Arrays

一個有效JSON文檔需要被包含在一對花括弧內
{ JSON-Data }

請注意,有些開發社區或線上文檔直接將上面的JSON文檔稱為JSON字串,這兩者的意思是一樣的

為什麼使用JSON

JSON被認為是XML的很好替代者。因為JSON的可讀性非常好,而且它沒有像XML那樣包含很多冗餘的元素標籤,這使得應用在使用JSON進行網路傳輸以及進行解析處理的速度更快,效率更高。

索引值對 —— Name/Value

索引值對是JSON中最基本的資料結構:
{ “firstName”: “John”}

在上面的例子中屬性"firstName"是用一對雙引號括起來的一個字串。而它的值"John"在這個例子中也是一個字串,當然它還可以是其他類型,具體可參考後面資料類型的章節。在市面上很多的產品或技術聲稱他們使用的是JSON資料格式,但他們在定義屬性時,並沒有用雙引號將屬性名稱括起來,其實這是違反JSON定義標準的。

對象 —— Object

一個JSON對象是包含了一組未排序索引值對的集合。下面例子中的address就是一個JSON對象:

{    “address” : {        “line1” : “555 Main Street”,        “city” : “Denver”,        “stateOrProvince” : “CO”,        “zipOrPostalCode” : “80202”,        “country” : “USA”    }}

上面的例子中address對象包含了5個屬性,它們之間用,進行分割

數組 —— Array

JSON中[]來包含數組元素,參考下面的例子:

{    “people” : [        { “firstName”: “John”, “lastName”: “Smith”, “age”: 35 },        { “firstName”: “Jane”, “lastName”: “Smith”, “age”: 32 }    ]}
資料類型

JSON中的數值(索引值對中的值)可以是以下任意一種:
Object
Array
String
Number
Boolean
null

Number

數實值型別資料可以是整型也可以是雙精確度的浮點型資料。下面是一些樣本:
“age”: 29“cost”: 299.99“temperature”: -10.5“speed_of_light”: 1.23e11“speed_of_light”: 1.23e+11“speed_of_light”: 1.23E11“speed_of_light”: 1.23E+11

上面的屬性(如age等)都是用雙引號括起來的字串,而數值是不需要用雙引號括起來的。你可以在數值前加上-號來表示負數,也可以採用科學計數法。但不能在數值前加0或使用16進位來表示一個數值。

Boolean

JSON中的Boolean值可以用true或false來表示。不用加{}
{ “emailValidated” : true}
Boolean值也不需要使用雙引號來修飾。

null

嚴格來說null並不是一個資料類型,但它非常重要,它表示一個屬性或元素沒有值。因此請注意 ‘ ‘ 表示的是Null 字元串,而null表示的才是空值。
{ “age” : null}

代碼注釋

JSON不允許在JSON文檔或字串中添加註釋。注釋功能最早在JSON中是存在的,但開發人員們錯誤地使用了它來輔助JSON資料的解析,當Douglas Crockford意識到這種不好的使用實踐後,便取消了注釋功能,以保證JSON在不同計算平台間作為互動資料格式的特性。

樣式

你可能已經注意到了在之前的例子中,所有的屬性名稱都使用了駝峰式的命名規則。這並不是JSON的一個標準要求,但這能夠協助提高JSON文檔的可讀性,因此作為一個事實標準在所有JSON應用中被使用。

文法

Douglas Crockford 在他的JSON網站http://www.json.org/中,給出了所有JSON文法語義的說明。另外還有一個iOS App JSON Pro FREE可以用來通過樣本學習或參考JSON。

JSON校正

一個文字文件或字串必須遵守JSON的文法定義,才能被視作一個有效JSON文檔。JSON文檔是否有效非常重要,因為它直接決定了,你的JSON資料能否在不同的應用中被正確地解析和使用。JSONLint提供了一個可互動的Web版JSON校正工具,你只需要將你的JSON文檔粘貼進去,並點擊校正按鈕,它便會自動進行校正,並將問題顯示在下方。


Paste_Image.png

在上面這個例子中,這個JSON對象的city屬性沒有加上雙引號,導致校正失敗。在返回的提示中,顯示了“Expecting ‘STRING‘, got ‘undefined‘”錯誤。
JSONLint也提供了一個可以在Chrome中直接使用的外掛程式。

JSON資料模型

在應用中手工編寫JSON文檔,會很枯燥並容易出錯。為了防止這樣的惡錯誤 ,你可以使用JSONPad或JSON Editor Online這樣的工具,它們能夠協助你構建JSON邏輯模型(類似於UML),然後通過模型產生JSON文檔。

JSON Editor Online

[ JSON Editor Online] (http://jsoneditoronline.org/) 是一個線上JSON資料建模工具,他也提供了一個Chrome外掛程式可以使用。


Paste_Image.png瀏覽器中的JSON

Firefox和Chrome都提供了一些很好的外掛程式方便開發人員查看或處理JSON資料。

REST Client

Rest Client是Firefox中的一個擴充應用。他能夠協助開發人員在瀏覽器中調試REST風格的Web Service。它最大的優點是能將返回的JSON資料結果,以很好的格式顯示出來。


Paste_Image.pngJSONView

JSONView是一個FireFox和Chrome上的外掛程式,能夠很好地將JSON資料列印出來,從而大大提高了JSON資料的可讀性。


Paste_Image.pngJSON與AJAX

AJAX可能是使用JSON資料中最常見的情境了。下面的這段程式碼範例,通過jQuery來調用一個REST風格的Web Service,並處理返回的JSON對象。

$.getJSON(‘http://example/service/addresses/home/1’,    function(data) {        var address = JSON.parse(data);        console.log(“Address Line 1 = “ + address.line1);    });

在上面的這段代碼中,$getJSON(這是一種jQuery中$.ajax()標準調用的一種縮寫形式)會發起一個HTTP GET 請求,調用Web Service,之後在它的隱式回呼函數中,擷取返回的data資料,並通過JSON.parse()方法將返回的資料轉換為JSON對象。之後便可以像擷取普通屬性那樣(address.line1)擷取對象的屬性數值了。

JSON與JAVA

Jackson是JAVA中用來處理JSON的一個第三方庫。它很有名,並且提供了一組非常好用的JSON API。下面就是它的一個例子:

import java.io.Writer;import java.io.StringWriter;import org.codehaus.jackson.map.ObjectMapper;public class Address {    private String line1;    private String city;    private String stateOrProvince;    private String zipOrPostalCode;    private String country;    public Address() {}    public String getLine1() {        return line1;    }    public void setLine1(line1) {        this.line1 = line1;    }    // Remaining getters and setters ...}Address addrOut = new Address();// Call setters to populate addrOut …ObjectMapper mapper = new ObjectMapper(); // Reuse this.// Marshal Address object to JSON String.Writer writer = new StringWriter();mapper.writeValue(writer, addrOut);System.out.println(writer.toString());// Unmarshal Address object from JSON String.String addrJsonStr =“{“ +    “\”address\” : {“ +    “\”line1\” : \”555 Main Street\”,” +    “\”city\” : \”Denver\”,”    “\”stateOrProvince\” : \”CO\”,”    “\”zipOrPostalCode\” : \”80202\”,” +    “\”country\” : \”USA\”” +    “}” +“}”;Address addrIn = mapper.readValue(addrJsonStr, Address.class);

除了Jackson之外,還有一些其他基於JAVA的第三方JSON API庫。
API
Source

Google GSON
http://code.google.com/p/google-json/

SOJO
http://sojo.sourceforge.net/

org.json (by DouglasCrockford)
http://www.json.org/java

json-lib
http://sourceforge.net/projects/json-lib/

json-io
http://code.google.com/p/json-io

jsontools
http://jsontools.berlios.de/

jsonbeans
http://code.google.com/p/jsonbeans/

JSON與RUBY

Ruby中也有很多與JSON相關的第三方庫,而JSON gem是Ruby內建的,下面就是它的用法:

require ‘json’class Address    attr_accessor :line1, :city, :state_or_province,                  :zip_or_postal_code, :country    def initialize(line1=’’, city=’’, state_or_province=’’,        zip_or_postal_code=’’, country=’’)        @line1 = line1        @city = city        @state_or_province = state_or_province        @zip_or_postal_code = zip_or_postal_code        @country = country    end    def to_json        to_hash.to_json    end    def from_json!(str)        JSON.parse(str).each { |var, val| send(“#{var}=”, val) }    end    private    def to_hash        Hash[instance_variables.map { |var| [var[1..-1].to_sym,            send(var[1..-1])] }]    endend

JSON gem的to_json方法將字串或雜湊轉換為JSON。Address對象的to_json方法通過將它的成員轉換成雜湊再對雜湊值調用to_json,最終將一個Address對象轉換為JSON格式。

addr1 = Address.new(‘555 Main Street’, ‘Denver’, ‘CO’, ‘80231’,‘US’)puts addr1.to_json# Outputs the following …{“line1”:”555 Main Street”,”city”:”Denver”,”state_or_province”:”CO”,”zip_or_postal_code”:”80231”,”country”:”US”}

JSON gem的JSON.pase方法則將JSON字串轉換為雜湊。Address對象的from_jason!方法接收一個JSON字串,然後調用JSON.parse來轉換雜湊,然後再在對象上分別設定這些雜湊的值。
json_addr = <<END{ “line1” : “999 Broadway”, “city” : “Anytown”, “state_or_province” : “CA”, “zip_or_postal_code” : “90210”, “country” : “USA”}ENDaddr2 = Address.newaddr2.from_json!(json_addr)

除了JSON gem之外,還有以下一些Ruby的JSON第三方庫
API
Source

ActiveSupport JSON
http://api.rubyonrails.org/classes/ActiveSupport/JSON.html

Yajl
https://github.com/brianmario/yajl-ruby

Oj
https://github.com/ohler55/oj

JSON與RUBY ON RAILS
Ruby on Rails也提供了將Ruby對象轉換為JSON的功能。下面的例子中的Controller使用了render方法將一個Ruby對象以JSON資料的格式進行輸出。
Rails中的ApplicationController會負責對象與JSON資料之間的互相轉換 。因此,不需要額外調用to_json方法。

JSON SCHEMA

JSON Schema用來定義JSON文檔的結構,它可以被用來驗證和校正發送或收到的JSON文檔是否有效和規範。JSON Schema本身也是用JSON格式編寫的,它的具體定義可以參考http://json-schema.org。
下面是JSON Schema的部分結構定義:
結構
描述

type
對象的資料類型,如Object,array,string,number 等

$schema
提供Schema版本的URI

required
true/false

id
資料元素id

properties
資料元素的校正屬性,包括最大值,最小值,枚舉等

下面是JSON Schema的一個樣本
“type”: “object”,“$schema”: “http://json-schema.org/draft-03/schema”,“id”: “#”,“required”: true,“properties”: { “registrants”: { “type”: “array”, “id”: “registrants”, “required”: true, “items”: { “type”: “object”, “required”: false, “properties”: { “address”: { “type”: “object”, “id”: “address”, “required”: true, “properties”: { “city”: { “type”: “string”, “id”: “city”, “required”: true }, “country”: { “type”: “string”, “id”: “country”, “required”: false }, “line1”: { “type”: “string”, “id”: “line1”, “required”: true }, “line2”: { “type”: “string”, “id”: “line2”, “required”: false }, “postalCode”: { “type”: “string”, “id”: “postalCode”, “required”: true }, “premise”: { “type”: “string”, “id”: “premise”, “required”: true, “enum”: [ “work”, “home”, “other” ] }, “stateOrProvince”: { “type”: “string”, “id”: “stateOrProvince”, “required”: true } } }, “firstName”: { “type”: “string”, “id”: “firstName”, “required”: true }, “lastName”: { “type”: “string”, “id”: “lastName”, “required”: true }, “phoneNumber”: { “type”: “object”, “id”: “phoneNumber”, “required”: true, “properties”: { “channel”: { “type”: “string”, “id”: “channel”, “required”: true, “enum”: [ “cell”, “work”, “home” ] }, “number”: { “type”: “string”, “id”: “number”, “required”: true } } } } } } } }

在上面的Schema中對JSON對象做了以下約束:
registrants必須是一個數組對象
phoneNumber的channel必須是cell, work, fax, home中的一個
address的premise必須是home, work, other中的一個。

一個使用上述JSON Schema的Web Service可以解析和處理下面這個JSON文檔:
{ "registrants": [ { "firstName": "Fred", "lastName": "Smith", "phoneNumber": { "channel": "cell", "number": "303-555-1212" }, "address": { "premise": "home", "line1": "555 Broadway NW", "line2": "# 000", "city": "Denver", "stateOrProvince": "CO", "postalCode": "88888", "country": "USA" } } ]}

JSON Schema 產生器
我們可以使用JSON Schema產生器來為一個有效JSON文檔產生對應的Schema。你需要訪問(www.jsonschema.net),然後按照以下步驟操作:
將你的JSON文檔粘貼到右側文字框
選擇JSON輸入選項
點擊Generate Schema按鈕

JSON Schema 校正器
我們可以用JSON Schema Validator來保證我們的JSON文檔時有效。下面是針對不同開發語言的一些常見的JSON Schema 校正器。
校正器
程式設計語言
項目地址

JSV
JavaScript
https://github.com/garycourt/JSV

Ruby JSON Schema Validator
Ruby
https://github.com/hoxworth/jsonschema

json-schemavalidator
Java
https://github.com/fge/json-schema-validator

php-json-schema(by MIT)
PHP
https://github.com/hasbridge/php-json-schema

JSON.Net
.NET
http://james.newtonking.com/projects/json-net.aspx

除了上面這些與程式設計語言相關的校正器之外,你還可以直接使用線上的JSON Schema校正器( http://json-schema-validator.herokuapp.com ),將Schema和JSON文檔粘貼到左側的文字框中,然後點擊Validate按鈕,校正的結果就會顯示在螢幕右側。
總結
以上,我們已經初步瞭解了JSON的核心定義和用法,但對於JSON本身來說我們還只是瞭解了其中很小的一部分,還有許多與它相關的工具或技術可以使用。JSON作為一個資料標準,它已經逐步替代XML成為Internet上最受歡迎的互動資料格式。
簡書籤約技匠,以上內容歡迎大家分享到朋友圈/微博等。如需轉載,請通過簡信聯絡授權。謝謝大家!




Json簡介

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.