JSONjavascript
JavaScript Object Notation:是JavaScript的子集,直接用便可。不須要任何特殊的 API 或工具包java
格式:web
{「名」:」值」} 名值對,若是有多個,即數組則[]嵌套便可。json
{「name1」:[{「name1.1」:」value1.1」},{「name1.2」:」value1.2」}]}數組
{ "people": //名服務器
[ { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }, 網絡
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"}, app
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }工具
]//值編碼
}
[ {"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" }]
}
格式描述以下:
對象是一個無序的「‘名稱/值’對」集合。一個對象以「{」(左括號)開始,「}」(右括號)結束。每一個「名稱」後跟一個「:」(冒號);「‘名稱/值’ 對」之間使用「,」(逗號)分隔。
數組是值(value)的有序集合。一個數組以「[」(左中括號)開始,「]」(右中括號)結束。值之間使用「,」(逗號)分隔。
值(value)能夠是雙引號括起來的字符串(string)、數值(number)、true、false、 null、對象(object)或者數組(array)。這些結構能夠嵌套。
即一個元素一個{},多個元素能夠寫在一個{}或用[]來實現。也就是說「名」就至關於一個變量名。
在javascript裏面使用JSON:此時people變量就再也不是JSON格式的字符串數據了。
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" }]
}//這樣就能夠了,就直接把JSON格式的數據給javascript的一個變量。
訪問JSON裏面的值:
people.programmers[0].lastName; 數組索引是從零開始的。結果是字符串值McLaughlin
修改裏面的值:
people.programmers[0].lastName = 「new_Value」;
轉換會JSON字符串:
String newJSONtext = people.toJSONString();//不是javascript爲弱類型麼?怎麼用String
能夠將 任何JavaScript 對象轉換爲 JSON 文本,以下:
String myObjectJSON = myObject.toJSONString();
網絡教程:http://www.w3school.com.cn/json/
Eval():可使用eval()方法,用於執行一個javascript段,返回執行結果。對於XML,使用DOM來處理。JSON比XML在Ajax方面更快。用eval()處理JSON字符串。
JSON 語法規則
JSON 語法是 JavaScript 對象表示法語法的子集。
· 數據在名稱/值對中 」 firstName」:」Jone」 等價JS的firstName=」Jone」
· 數據由逗號分隔
· 花括號保存對象
· 方括號保存數組
JSON 值
JSON 值能夠是:(就是名值對的值)
· 數字(整數或浮點數)
· 字符串(在雙引號中)
· 邏輯值(true 或 false)
· 數組(在方括號中)
· 對象(在花括號中) :就是{裏面是名值對,或數組,對象等};
· null
JSON 文件
· JSON 文件的文件類型是 ".json"
· JSON 文本的 MIME 類型是 "application/json"
JSON的經常使用用法是從web 服務器讀JSON字符串,或者說是後臺傳給前臺。
從以前能夠知道JSON就是對象的訪問放式,可是在JS中倒是一個字符串,那麼要做爲對象怎麼辦??就用eval()方法編譯JSON字符串,返回的對象就能夠了。
var txt = '{ "employees" : [' +
'{ "firstName":"Bill" , "lastName":"Gates" },' +
'{ "firstName":"George" , "lastName":"Bush" },' +
'{ "firstName":"Thomas" , "lastName":"Carter" } ]}';
var obj = eval ("(" + txt + ")");//爲了不語法錯,須要加括號。
obj.employees[1].firstName//就能夠訪問或賦值了。
讓JSON能夠傳遞到服務器,那麼就要遵循GWT格式,因爲不能直接是GWT的標準格式,那麼就須要一些額外的操做:
第一,引用HTTP 和JSON 支持。
第二,在客戶端建立JSON 數據,提交到服務器
第三,在服務器上重寫數據格式解析的代碼,使之支持JSON 格式的數據
第四,在服務器上組織JSON 格式的數據,返回給客戶端。
第五,客戶端解析服務器傳回的JSON 數據,正確的顯示。
詳見JSON教程.pdf。
這裏就有了類型了:JSONArray,JSONBoolean,JSONException,JSONObject 等等。一整個JSON均可以用JSONObject來裝。見教程2頁。
JSONObject input = new JSONObject();
JSONString value = new JSONString(「value」);
Json寫完以後,遇到的最多的問題就是解析錯誤,格式不對,那怎麼調?
下面給個在線校驗的工具,寫完以後校驗一下就完畢了:
對於C++解析Json,下面給一個網上的文章,很好用:
【轉】C++解析JSON的好文章
使用C++處理JSON數據交換格式
1、摘要
JSON的全稱爲:JavaScript Object Notation,顧名思義,JSON是用於標記Javascript對象的,JSON官方的解釋爲:JSON是一種輕量級的數據傳輸格式。
本文並不詳細介紹JSON自己的細節,旨在討論如何使用C++語言來處理JSON。關於JSON更具體的信息,可參見JSON官網:http://www.json.org。
2、本文選擇處理JSON的C++庫
本文選擇一個第三方庫jsoncpp來解析JSON。jsoncpp是比較出名的C++ JSON解析庫。在JSON官網也是首推的。
下載地址爲:http://sourceforge.net/projects/jsoncpp。本文使用的jsoncpp版本爲:0.5.0。
3、jsoncpp在Windows下的編譯
要使用第三方源碼庫,第一步少不了的就是編譯,將源碼文件編譯成咱們方便使用的動態連接庫、靜態連接庫或者靜態導入庫[1]。
jsconcpp進行JSON解析的源碼文件分佈在include/json、src/lib_json下。其實jsoncpp源碼並很少,爲了方便產品管理,此處不必將其編譯爲動態連接庫或者靜態導入庫,因此咱們選擇使用靜態連接庫[2]。
jsoncpp已經處理的很完善了,全部編譯選項都已經配置好,打開makefiles/vs71/jsoncpp.sln即可以開始編譯(默認是使用VS2003編譯器的,打開時直接按照VS2005提示轉換便可)。
4、jsoncpp使用詳解
jsoncpp主要包含三種類型的class:Value、Reader、Writer。jsoncpp中全部對象、類名都在namespace Json中,包含json.h便可。
Json::Value只能處理ANSI類型的字符串,若是C++程序是用Unicode編碼的,最好加一個Adapt類來適配。
一、Value
Json::Value是jsoncpp中最基本、最重要的類,用於表示各類類型的對象,jsoncpp支持的對象類型可見Json::ValueType枚舉值。
可以下是用Json::Value類:
Json::Value json_temp; //臨時對象,供以下代碼使用
json_temp["name"] = Json::Value("huchao");
json_temp["age"] = Json::Value(26);
Json::Value root; //表示整個json對象
root["key_string"] = Json::Value("value_string"); //新建一個Key(名爲:key_string),賦予字符串值:"value_string"。
root["key_number"] = Json::Value(12345); //新建一個Key(名爲:key_number),賦予數值:12345。
root["key_boolean"] = Json::Value(false); //新建一個Key(名爲:key_boolean),賦予bool值:false。
root["key_double"] = Json::Value(12.345); //新建一個Key(名爲:key_double),賦予double值:12.345。
root["key_object"] = Json_temp; //新建一個Key(名爲:key_object),賦予json::Value對象值。
root["key_array"].append("array_string"); //新建一個Key(名爲:key_array),類型爲數組,對第一個元素賦值爲字符串:"array_string"。
root["key_array"].append(1234); //爲數組key_array賦值,對第二個元素賦值爲:1234。
Json::ValueType type = root.type(); //得到root的類型,此處爲objectValue類型。
注:跟C++不一樣,JavaScript數組能夠爲任意類型的值,因此jsoncpp也能夠。
如上幾個用法已經能夠知足絕大部分json應用了,固然jsoncpp還有一些其餘同能,好比說設置註釋、比較json大小、交換json對象等,都很容易使用,你們本身嘗試吧。
二、Writer
如上說了Json::Value的使用方式,如今到了該查看剛纔賦值內容的時候了,查看json內容,使用Writer類便可。
Jsoncpp的Json::Writer類是一個純虛類,並不能直接使用。在此咱們使用Json::Writer的子類:Json::FastWriter、Json::StyledWriter、Json::StyledStreamWriter。
顧名思義,用Json::FastWriter來處理json應該是最快的,下面咱們來試試。
Json::FastWriter fast_writer;
std::cout << fast_writer.write(root) << std::endl;
輸出結果爲:
{"key_array":["array_string",1234],"key_boolean":false,"key_double":12.3450,"key_number":12345,"key_object":{"age":26,"name":"huchao"},"key_string":"value_string"}
再次顧名思義,用Json::StyledWriter是格式化後的json,下面咱們來看看Json::StyledWriter是怎樣格式化的。
Json::StyledWriter styled_writer;
std::cout << styled_writer.write(root) << std::endl;
輸出結果爲:
{
"key_array" : [ "array_string", 1234 ],
"key_boolean" : false,
"key_double" : 12.3450,
"key_number" : 12345,
"key_object" : {
"age" : 26,
"name" : "huchao"
},
"key_string" : "value_string"
}
三、Reader
Json::Reader是用於讀取的,說的確切點,是用於將字符串轉換爲Json::Value對象的,下面咱們來看個簡單的例子。
Json::Reader reader;
Json::Value json_object;
const char* json_document = "{\"age\" : 26,\"name\" : \"huchao\"}";
if (!reader.parse(json_document, json_object))
return 0;
std::cout << json_object["name"] << std::endl;
std::cout << json_object["age"] << std::endl;
輸出結果爲:
"huchao"
26
可見,上述代碼已經解析出了json字符串。
--------------------------------------
[1]:使用第三方源碼最簡單的方法是直接將文件加入工程,但這樣不利於源碼、軟件產品管理,對於通常軟件開發來講,不建議使用。
[2]:若是真須要編譯成動態連接庫、靜態導入庫的話,可使用VS新建一個工程屬性,而後在Project --> Properties中進行相應的設置便可。