javascript
java json 教程,【简明教程】JSON
JSON概覽
JSON(JavaScript Object Notation)是一種基于文本的數(shù)據(jù)交換格式。無(wú)論你的應(yīng)用是用哪種開(kāi)發(fā)語(yǔ)言編寫的(Java/EE,Ruby,PHP,C#/.Net等等),你都可以使用JSON來(lái)通過(guò)網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)交互和處理。幾乎所有的編程語(yǔ)言都有很好的庫(kù)或第三方工具來(lái)提供基于JSON的API支持,因此你可以非常方便地使用任何自己喜歡的編程語(yǔ)言來(lái)處理JSON數(shù)據(jù)。而另一方面隨著REST、像MongoDB這樣的NoSQL技術(shù)或標(biāo)準(zhǔn)的廣泛使用,JSON也正成為一種被推薦的數(shù)據(jù)交互格式。
JSON是在2001年,由Douglas Crockford創(chuàng)建的,并且被IETF(Internet Engineering Task Force)定義為RFC 4627標(biāo)準(zhǔn),詳請(qǐng)參考:http://tools.ietf.org/html/rfc4627。JSON的媒體類型被定義為 application/json,而文件的后綴為.json。
JSON是什么
JSON是一種簡(jiǎn)單數(shù)據(jù)格式,它有三種數(shù)據(jù)結(jié)構(gòu):
鍵值對(duì) —— Name/Value (Key/Value)
對(duì)象 —— Object
數(shù)組 —— Arrays
一個(gè)有效的JSON文檔需要被包含在一對(duì)花括號(hào)內(nèi)
{ JSON-Data }
請(qǐng)注意,有些開(kāi)發(fā)社區(qū)或線上文檔直接將上面的JSON文檔稱為JSON字符串,這兩者的意思是一樣的。
為什么使用JSON
JSON被認(rèn)為是XML的很好替代者。因?yàn)镴SON的可讀性非常好,而且它沒(méi)有像XML那樣包含很多冗余的元素標(biāo)簽,這使得應(yīng)用在使用JSON進(jìn)行網(wǎng)絡(luò)傳輸以及進(jìn)行解析處理的速度更快,效率更高。
鍵值對(duì) —— Name/Value
鍵值對(duì)是JSON中最基本的數(shù)據(jù)結(jié)構(gòu):
{
“firstName”: “John”
}
在上面的例子中屬性"firstName"是用一對(duì)雙引號(hào)括起來(lái)的一個(gè)字符串。而它的值"John"在這個(gè)例子中也是一個(gè)字符串,當(dāng)然它還可以是其他類型,具體可參考后面數(shù)據(jù)類型的章節(jié)。在市面上很多的產(chǎn)品或技術(shù)聲稱他們使用的是JSON數(shù)據(jù)格式,但他們?cè)诙x屬性時(shí),并沒(méi)有用雙引號(hào)將屬性名稱括起來(lái),其實(shí)這是違反JSON定義標(biāo)準(zhǔn)的。
對(duì)象 —— Object
一個(gè)JSON對(duì)象是包含了一組未排序鍵值對(duì)的集合。下面例子中的address就是一個(gè)JSON對(duì)象:
{
“address” : {
“l(fā)ine1” : “555 Main Street”,
“city” : “Denver”,
“stateOrProvince” : “CO”,
“zipOrPostalCode” : “80202”,
“country” : “USA”
}
}
上面的例子中address對(duì)象包含了5個(gè)屬性,它們之間用,進(jìn)行分割。
數(shù)組 —— Array
JSON中[]來(lái)包含數(shù)組元素,參考下面的例子:
{
“people” : [
{ “firstName”: “John”, “l(fā)astName”: “Smith”, “age”: 35 },
{ “firstName”: “Jane”, “l(fā)astName”: “Smith”, “age”: 32 }
]
}
數(shù)據(jù)類型
JSON中的數(shù)值(鍵值對(duì)中的值)可以是以下任意一種:
Object
Array
String
Number
Boolean
null
Number
數(shù)值類型數(shù)據(jù)可以是整型也可以是雙精度的浮點(diǎn)型數(shù)據(jù)。下面是一些示例:
“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等)都是用雙引號(hào)括起來(lái)的字符串,而數(shù)值是不需要用雙引號(hào)括起來(lái)的。你可以在數(shù)值前加上-號(hào)來(lái)表示負(fù)數(shù),也可以采用科學(xué)計(jì)數(shù)法。但不能在數(shù)值前加0或使用16進(jìn)制來(lái)表示一個(gè)數(shù)值。
Boolean
JSON中的Boolean值可以用true或false來(lái)表示。
{
“emailValidated” : true
}
Boolean值也不需要使用雙引號(hào)來(lái)修飾。
null
嚴(yán)格來(lái)說(shuō)null并不是一個(gè)數(shù)據(jù)類型,但它非常重要,它表示一個(gè)屬性或元素沒(méi)有值。因此請(qǐng)注意 ' ' 表示的是空字符串,而null表示的才是空值。
{
“age” : null
}
代碼注釋
JSON不允許在JSON文檔或字符串中添加注釋。注釋功能最早在JSON中是存在的,但開(kāi)發(fā)者們錯(cuò)誤地使用了它來(lái)輔助JSON數(shù)據(jù)的解析,當(dāng)Douglas Crockford意識(shí)到這種不好的使用實(shí)踐后,便取消了注釋功能,以保證JSON在不同計(jì)算平臺(tái)間作為交互數(shù)據(jù)格式的特性。
樣式
你可能已經(jīng)注意到了在之前的例子中,所有的屬性名稱都使用了駝峰式的命名規(guī)則。這并不是JSON的一個(gè)標(biāo)準(zhǔn)要求,但這能夠幫助提高JSON文檔的可讀性,因此作為一個(gè)事實(shí)標(biāo)準(zhǔn)在所有JSON應(yīng)用中被使用。
語(yǔ)法
Douglas Crockford 在他的JSON網(wǎng)站http://www.json.org/中,給出了所有JSON語(yǔ)法語(yǔ)義的說(shuō)明。另外還有一個(gè)iOS App JSON Pro FREE可以用來(lái)通過(guò)示例學(xué)習(xí)或參考JSON。
JSON校驗(yàn)
一個(gè)文本文檔或字符串必須遵守JSON的語(yǔ)法定義,才能被視作一個(gè)有效的JSON文檔。JSON文檔是否有效非常重要,因?yàn)樗苯記Q定了,你的JSON數(shù)據(jù)能否在不同的應(yīng)用中被正確地解析和使用。JSONLint提供了一個(gè)可交互的Web版JSON校驗(yàn)工具,你只需要將你的JSON文檔粘貼進(jìn)去,并點(diǎn)擊校驗(yàn)按鈕,它便會(huì)自動(dòng)進(jìn)行校驗(yàn),并將問(wèn)題顯示在下方。
在上面這個(gè)例子中,這個(gè)JSON對(duì)象的city屬性沒(méi)有加上雙引號(hào),導(dǎo)致校驗(yàn)失敗。在返回的提示中,顯示了“Expecting 'STRING', got 'undefined'”錯(cuò)誤。
JSONLint也提供了一個(gè)可以在Chrome中直接使用的插件。
JSON數(shù)據(jù)模型
在應(yīng)用中手工編寫JSON文檔,會(huì)很枯燥并容易出錯(cuò)。為了防止這樣的惡錯(cuò)誤 ,你可以使用JSONPad或JSON Editor Online這樣的工具,它們能夠幫助你構(gòu)建JSON邏輯模型(類似于UML),然后通過(guò)模型生成JSON文檔。
JSON Editor Online
[ JSON Editor Online] (http://jsoneditoronline.org/) 是一個(gè)在線JSON數(shù)據(jù)建模工具,他也提供了一個(gè)Chrome插件可以使用。
瀏覽器中的JSON
Firefox和Chrome都提供了一些很好的插件方便開(kāi)發(fā)人員查看或處理JSON數(shù)據(jù)。
REST Client
Rest Client是Firefox中的一個(gè)擴(kuò)展應(yīng)用。他能夠幫助開(kāi)發(fā)人員在瀏覽器中調(diào)試REST風(fēng)格的Web Service。它最大的優(yōu)點(diǎn)是能將返回的JSON數(shù)據(jù)結(jié)果,以很好的格式顯示出來(lái)。
JSONView
JSONView是一個(gè)FireFox和Chrome上的插件,能夠很好地將JSON數(shù)據(jù)打印出來(lái),從而大大提高了JSON數(shù)據(jù)的可讀性。
JSON與AJAX
AJAX可能是使用JSON數(shù)據(jù)中最常見(jiàn)的場(chǎng)景了。下面的這段代碼示例,通過(guò)jQuery來(lái)調(diào)用一個(gè)REST風(fēng)格的Web Service,并處理返回的JSON對(duì)象。
$.getJSON(‘http://example/service/addresses/home/1’,
function(data) {
var address = JSON.parse(data);
console.log(“Address Line 1 = “ + address.line1);
}
);
在上面的這段代碼中,$getJSON(這是一種jQuery中$.ajax()標(biāo)準(zhǔn)調(diào)用的一種縮寫形式)會(huì)發(fā)起一個(gè)HTTP GET 請(qǐng)求,調(diào)用Web Service,之后在它的隱式回調(diào)函數(shù)中,獲取返回的data數(shù)據(jù),并通過(guò)JSON.parse()方法將返回的數(shù)據(jù)轉(zhuǎn)換為JSON對(duì)象。之后便可以像獲取普通屬性那樣(address.line1)獲取對(duì)象的屬性數(shù)值了。
JSON與JAVA
Jackson是JAVA中用來(lái)處理JSON的一個(gè)第三方庫(kù)。它很有名,并且提供了一組非常好用的JSON API。下面就是它的一個(gè)例子:
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庫(kù)。
JSON與RUBY
Ruby中也有很多與JSON相關(guān)的第三方庫(kù),而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])] }]
end
end
JSON gem的to_json方法將字符串或哈希轉(zhuǎn)換為JSON。Address對(duì)象的to_json方法通過(guò)將它的成員轉(zhuǎn)換成哈希再對(duì)哈希值調(diào)用to_json,最終將一個(gè)Address對(duì)象轉(zhuǎn)換為JSON格式。
addr1 = Address.new(‘555 Main Street’, ‘Denver’, ‘CO’, ‘80231’,
‘US’)
puts addr1.to_json
# Outputs the following …
{“l(fā)ine1”:”555 Main Street”,”city”:”Denver”,”state_or_
province”:”CO”,”zip_or_postal_code”:”80231”,”country”:”US”}
JSON gem的JSON.pase方法則將JSON字符串轉(zhuǎn)換為哈希。Address對(duì)象的from_jason!方法接收一個(gè)JSON字符串,然后調(diào)用JSON.parse來(lái)轉(zhuǎn)換哈希,然后再在對(duì)象上分別設(shè)置這些哈希的值。
json_addr = <
{
“l(fā)ine1” : “999 Broadway”, “city” : “Anytown”,
“state_or_province” : “CA”, “zip_or_postal_code” : “90210”,
“country” : “USA”
}
END
addr2 = Address.new
addr2.from_json!(json_addr)
除了JSON gem之外,還有以下一些Ruby的JSON第三方庫(kù)
JSON與RUBY ON RAILS
Ruby on Rails也提供了將Ruby對(duì)象轉(zhuǎn)換為JSON的功能。下面的例子中的Controller使用了render方法將一個(gè)Ruby對(duì)象以JSON數(shù)據(jù)的格式進(jìn)行輸出。
Rails中的ApplicationController會(huì)負(fù)責(zé)對(duì)象與JSON數(shù)據(jù)之間的互相轉(zhuǎn)換 。因此,不需要額外調(diào)用to_json方法。
JSON SCHEMA
JSON Schema用來(lái)定義JSON文檔的結(jié)構(gòu),它可以被用來(lái)驗(yàn)證和校驗(yàn)發(fā)送或收到的JSON文檔是否有效和規(guī)范。JSON Schema本身也是用JSON格式編寫的,它的具體定義可以參考http://json-schema.org。
下面是JSON Schema的部分結(jié)構(gòu)定義:
結(jié)構(gòu)
描述
type
對(duì)象的數(shù)據(jù)類型,如Object,array,string,number 等
$schema
提供Schema版本的URI
required
true/false
id
數(shù)據(jù)元素id
properties
數(shù)據(jù)元素的校驗(yàn)屬性,包括最大值,最小值,枚舉等
下面是JSON Schema的一個(gè)示例
“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
},
“l(fā)ine1”: {
“type”: “string”,
“id”: “l(fā)ine1”,
“required”: true
},
“l(fā)ine2”: {
“type”: “string”,
“id”: “l(fā)ine2”,
“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
},
“l(fā)astName”: {
“type”: “string”,
“id”: “l(fā)astName”,
“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中對(duì)JSON對(duì)象做了以下約束:
registrants必須是一個(gè)數(shù)組對(duì)象
phoneNumber的channel必須是cell, work, fax, home中的一個(gè)
address的premise必須是home, work, other中的一個(gè)。
一個(gè)使用上述JSON Schema的Web Service可以解析和處理下面這個(gè)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生成器來(lái)為一個(gè)有效的JSON文檔生成對(duì)應(yīng)的Schema。你需要訪問(wèn)(www.jsonschema.net),然后按照以下步驟操作:
將你的JSON文檔粘貼到右側(cè)文本框
選擇JSON輸入選項(xiàng)
點(diǎn)擊Generate Schema按鈕
JSON Schema 校驗(yàn)器
我們可以用JSON Schema Validator來(lái)保證我們的JSON文檔時(shí)有效的。下面是針對(duì)不同開(kāi)發(fā)語(yǔ)言的一些常見(jiàn)的JSON Schema 校驗(yàn)器。
除了上面這些與編程語(yǔ)言相關(guān)的校驗(yàn)器之外,你還可以直接使用在線的JSON Schema校驗(yàn)器( http://json-schema-validator.herokuapp.com ),將Schema和JSON文檔粘貼到左側(cè)的文本框中,然后點(diǎn)擊Validate按鈕,校驗(yàn)的結(jié)果就會(huì)顯示在屏幕右側(cè)。
總結(jié)
以上,我們已經(jīng)初步了解了JSON的核心定義和用法,但對(duì)于JSON本身來(lái)說(shuō)我們還只是了解了其中很小的一部分,還有許多與它相關(guān)的工具或技術(shù)可以使用。JSON作為一個(gè)數(shù)據(jù)標(biāo)準(zhǔn),它已經(jīng)逐步替代XML成為Internet上最受歡迎的交互數(shù)據(jù)格式。
簡(jiǎn)書簽約作者:技匠,以上內(nèi)容歡迎大家分享到朋友圈/微博等。如需轉(zhuǎn)載,請(qǐng)通過(guò)簡(jiǎn)信聯(lián)系授權(quán)。謝謝大家!
總結(jié)
以上是生活随笔為你收集整理的java json 教程,【简明教程】JSON的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: io密集型和cpu密集型java,如何设
- 下一篇: matlab中图像太大,图像处理:算法在