json的用法
json格式
JSON格式:http://www.json.org/
python和JSON的關(guān)系請(qǐng)參考:http://docs.python.org/library/json.html
JSON建構(gòu)有兩種結(jié)構(gòu):
1.?“名稱/值”對(duì)的集合(A?collection?of?name/value?pairs)。不同的語言中,它被理解為對(duì)象(object),記錄(record),結(jié)構(gòu)(struct),字典(dictionary),哈希表(hash?table),有鍵列表(keyed?list),或者關(guān)聯(lián)數(shù)組?(associative?array)。
2.值的有序列表(An?ordered?list?of?values)。在大部分語言中,它被理解為數(shù)組(array)。
基礎(chǔ)示例
簡單地說,JSON?可以將?JavaScript?對(duì)象中表示的一組數(shù)據(jù)轉(zhuǎn)換為字符串,然后就可以在函數(shù)之間輕松地傳遞這個(gè)字符串,或者在異步應(yīng)用程序中將字符串從?Web?客戶機(jī)傳遞給服務(wù)器端程序。這個(gè)字符串看起來有點(diǎn)兒古怪,但是?JavaScript?很容易解釋它,而且?JSON?可以表示比"名稱?/?值對(duì)"更復(fù)雜的結(jié)構(gòu)。例如,可以表示數(shù)組和復(fù)雜的對(duì)象,而不僅僅是鍵和值的簡單列表。
表示名稱?/?值對(duì)
按照最簡單的形式,可以用下面這樣的?JSON?表示"名稱?/?值對(duì)":
{?"firstName":?"Brett"?}?
這個(gè)示例非常基本,而且實(shí)際上比等效的純文本"名稱?/?值對(duì)"占用更多的空間:
firstName=Brett?
但是,當(dāng)將多個(gè)"名稱?/?值對(duì)"串在一起時(shí),JSON?就會(huì)體現(xiàn)出它的價(jià)值了。首先,可以創(chuàng)建包含多個(gè)"名稱?/?值對(duì)"的?記錄,比如:
{?"firstName":?"Brett",?"lastName":"McLaughlin",?"email":?"aaaa"?}?
從語法方面來看,這與"名稱?/?值對(duì)"相比并沒有很大的優(yōu)勢,但是在這種情況下?JSON?更容易使用,而且可讀性更好。例如,它明確地表示以上三個(gè)值都是同一記錄的一部分;花括號(hào)使這些值有了某種聯(lián)系。
表示數(shù)組
當(dāng)需要表示一組值時(shí),JSON?不但能夠提高可讀性,而且可以減少復(fù)雜性。例如,假設(shè)您希望表示一個(gè)人名列表。在?XML?中,需要許多開始標(biāo)記和結(jié)束標(biāo)記;如果使用典型的名稱?/?值對(duì)(就像在本系列前面文章中看到的那種名稱?/?值對(duì)),那么必須建立一種專有的數(shù)據(jù)格式,或者將鍵名稱修改為?person1-firstName這樣的形式。
如果使用?JSON,就只需將多個(gè)帶花括號(hào)的記錄分組在一起:
{?"people":?[?
{?"firstName":?"Brett",?"lastName":"McLaughlin",?"email":?"aaaa"?},?
{?"firstName":?"Jason",?"lastName":"Hunter",?"email":?"bbbb"},?
{?"firstName":?"Elliotte",?"lastName":"Harold",?"email":?"cccc"?}?
]}?
這不難理解。在這個(gè)示例中,只有一個(gè)名為?people的變量,值是包含三個(gè)條目的數(shù)組,每個(gè)條目是一個(gè)人的記錄,其中包含名、姓和電子郵件地址。上面的示例演示如何用括號(hào)將記錄組合成一個(gè)值。當(dāng)然,可以使用相同的語法表示多個(gè)值(每個(gè)值包含多個(gè)記錄):
{?"programmers":?[
{?"firstName":?"Brett",?"lastName":"McLaughlin",?"email":?"aaaa"?},?
{?"firstName":?"Jason",?"lastName":"Hunter",?"email":?"bbbb"?},?
{?"firstName":?"Elliotte",?"lastName":"Harold",?"email":?"cccc"?}
],
"authors":?[?
{?"firstName":?"Isaac",?"lastName":?"Asimov",?"genre":?"science?fiction"?},?
{?"firstName":?"Tad",?"lastName":?"Williams",?"genre":?"fantasy"?},?
{?"firstName":?"Frank",?"lastName":?"Peretti",?"genre":?"christian?fiction"?}?
],?
"musicians":?[?
{?"firstName":?"Eric",?"lastName":?"Clapton",?"instrument":?"guitar"?},?
{?"firstName":?"Sergei",?"lastName":?"Rachmaninoff",?"instrument":?"piano"?}?
]?}?
這里最值得注意的是,能夠表示多個(gè)值,每個(gè)值進(jìn)而包含多個(gè)值。但是還應(yīng)該注意,在不同的主條目(programmers、authors?和?musicians)之間,記錄中實(shí)際的名稱?/?值對(duì)可以不一樣。JSON?是完全動(dòng)態(tài)的,允許在?JSON?結(jié)構(gòu)的中間改變表示數(shù)據(jù)的方式。
在處理?JSON?格式的數(shù)據(jù)時(shí),沒有需要遵守的預(yù)定義的約束。所以,在同樣的數(shù)據(jù)結(jié)構(gòu)中,可以改變表示數(shù)據(jù)的方式,甚至可以以不同方式表示同一事物。
格式應(yīng)用
掌握了?JSON?格式之后,在?JavaScript?中使用它就很簡單了。JSON?是?JavaScript?原生格式,這意味著在?JavaScript?中處理?JSON?數(shù)據(jù)不需要任何特殊的?API?或工具包。
將?JSON?數(shù)據(jù)賦值給變量
例如,可以創(chuàng)建一個(gè)新的?JavaScript?變量,然后將?JSON?格式的數(shù)據(jù)字符串直接賦值給它:
var?people?=?{?"programmers":?[?{?"firstName":?"Brett",?"lastName":"McLaughlin",?"email":?"aaaa"?},?
{?"firstName":?"Jason",?"lastName":"Hunter",?"email":?"bbbb"?},?
{?"firstName":?"Elliotte",?"lastName":"Harold",?"email":?"cccc"?}
],
"authors":?[?
{?"firstName":?"Isaac",?"lastName":?"Asimov",?"genre":?"science?fiction"?},?
{?"firstName":?"Tad",?"lastName":?"Williams",?"genre":?"fantasy"?},?
{?"firstName":?"Frank",?"lastName":?"Peretti",?"genre":?"christian?fiction"?}?
],?
"musicians":?[?
{?"firstName":?"Eric",?"lastName":?"Clapton",?"instrument":?"guitar"?},?
{?"firstName":?"Sergei",?"lastName":?"Rachmaninoff",?"instrument":?"piano"?}?
]?}?
這非常簡單;現(xiàn)在?people包含前面看到的?JSON?格式的數(shù)據(jù)。但是,這還不夠,因?yàn)樵L問數(shù)據(jù)的方式似乎還不明顯。
訪問數(shù)據(jù)
盡管看起來不明顯,但是上面的長字符串實(shí)際上只是一個(gè)數(shù)組;將這個(gè)數(shù)組放進(jìn)?JavaScript?變量之后,就可以很輕松地訪問它。實(shí)際上,只需用點(diǎn)號(hào)表示法來表示數(shù)組元素。所以,要想訪問?programmers?列表的第一個(gè)條目的姓氏,只需在?JavaScript?中使用下面這樣的代碼:
people.programmers[0].lastName;?
注意,數(shù)組索引是從零開始的。所以,這行代碼首先訪問?people變量中的數(shù)據(jù);然后移動(dòng)到稱為?programmers的條目,再移動(dòng)到第一個(gè)記錄([0]);最后,訪問?lastName鍵的值。結(jié)果是字符串值?“McLaughlin”。
下面是使用同一變量的幾個(gè)示例。
people.authors[1].genre?//?Value?is?"fantasy"?
people.musicians[3].lastName?//?Undefined.?This?refers?to?the?fourth?entry,?and?there?isn't?one?
people.programmers[2].firstName?//?Value?is?"Elliotte"?
利用這樣的語法,可以處理任何?JSON?格式的數(shù)據(jù),而不需要使用任何額外的?JavaScript?工具包或?API。
修改?JSON?數(shù)據(jù)
正如可以用點(diǎn)號(hào)和括號(hào)訪問數(shù)據(jù),也可以按照同樣的方式輕松地修改數(shù)據(jù):
people.musicians[1].lastName?=?"Rachmaninov";?
在將字符串轉(zhuǎn)換為?JavaScript?對(duì)象之后,就可以像這樣修改變量中的數(shù)據(jù)。
轉(zhuǎn)換回字符串
當(dāng)然,如果不能輕松地將對(duì)象轉(zhuǎn)換回本文提到的文本格式,那么所有數(shù)據(jù)修改都沒有太大的價(jià)值。在?JavaScript?中這種轉(zhuǎn)換也很簡單:
String?newJSONtext?=?people.toJSONString();?
這樣就行了!現(xiàn)在就獲得了一個(gè)可以在任何地方使用的文本字符串,例如,可以將它用作?Ajax?應(yīng)用程序中的請(qǐng)求字符串。
更重要的是,可以將?任何JavaScript?對(duì)象轉(zhuǎn)換為?JSON?文本。并非只能處理原來用?JSON?字符串賦值的變量。為了對(duì)名為?myObject的對(duì)象進(jìn)行轉(zhuǎn)換,只需執(zhí)行相同形式的命令:
String?myObjectInJSON?=?myObject.toJSONString();?
這就是?JSON?與本系列討論的其他數(shù)據(jù)格式之間最大的差異。如果使用?JSON,只需調(diào)用一個(gè)簡單的函數(shù),就可以獲得經(jīng)過格式化的數(shù)據(jù),可以直接使用了。對(duì)于其他數(shù)據(jù)格式,需要在原始數(shù)據(jù)和格式化數(shù)據(jù)之間進(jìn)行轉(zhuǎn)換。即使使用?Document?Object?Model?這樣的?API(提供了將自己的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為文本的函數(shù)),也需要學(xué)習(xí)這個(gè)?API?并使用?API?的對(duì)象,而不是使用原生的?JavaScript?對(duì)象和語法。
最終結(jié)論是,如果要處理大量?JavaScript?對(duì)象,那么?JSON?幾乎肯定是一個(gè)好選擇,這樣就可以輕松地將數(shù)據(jù)轉(zhuǎn)換為可以在請(qǐng)求中發(fā)送給服務(wù)器端程序的格式。
轉(zhuǎn)載于:https://www.cnblogs.com/chenrong/p/3578578.html
總結(jié)
- 上一篇: ipython 学习笔记 2 netwo
- 下一篇: fdsgds