JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。本質上來說,它和XML, YAML等格式化的資料格式沒有什麼區別,都易於人的閱讀和編寫,同時也易於機器解析和產生。它基於JavaScript Programming Language,Standard
ECMA-262 3rd Edition - December 1999的一個子集。 JSON採用完全獨立於語言的文字格式設定,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的資料交換語言。
JSON建構於兩種結構:
- “名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解為對象(object),紀錄(record),結構(struct),字典(dictionary),雜湊表(hash table),有鍵列表(keyed list),或者關聯陣列 (associative array)。
- 值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數組(array)。
這些都是常見的資料結構。事實上大部分現代電腦語言都以某種形式支援它們。這使得一種資料格式在同樣基於這些結構的程式設計語言之間交換成為可能。
JSON具有以下這些形式:
對象是一個無序的“‘名稱/值’對”集合。一個對象以“{”(左括弧)開始,“}”(右括弧)結束。每個“名稱”後跟一個“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。
數組是值(value)的有序集合。一個數組以“[”(左中括弧)開始,“]”(右中括弧)結束。值之間使用“,”(逗號)分隔。
值(value)可以是雙引號括起來的字串(string)、數值(number)、true、false、null、對象(object)或者數組(array)。這些結構可以嵌套。
字串(string)是由雙引號包圍的任意數量Unicode字元的集合,使用反斜線轉義。一個字元(character)即一個單獨的字串(character string)。
字串(string)與C或者Java的字串非常相似。
數值(number)也與C或者Java的數值非常相似。除去未曾使用的八進位與十六進位格式。除去一些編碼細節。
C++要使用JSON來解析資料,一般採用jsoncpp.
網站:http://sourceforge.net/projects/jsoncpp/
下載了之後,解壓,然後開啟\jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\makefiles\vs71
下的工程檔案,進行編譯連結就可以得到一個靜態連結庫json.lib
要用jsoncpp只需要將這個lib檔案拷貝到你的工程目錄下,並將jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\json
複製到工程目錄下,然後將這些標頭檔加到工程中去就可以了。
例子:
{
"name" : "ajioy",
"age" : 22
}
?
| 123456789101112131415161718192021222324252627 |
#pragma comment(lib, "json_mtd.lib") #include <fstream>#include <cassert>#include "json/json.h" int main() { ifstream ifs; ifs.open("testjson.json"); assert(ifs.is_open()); Json::Reader reader; Json::Value root; if(!reader.parse(ifs, root,false)) { return-1; } std::string name = root["name"].asString(); intage = root["age"].asInt(); std::cout<<name<<std::endl; std::cout<<age<<std::endl; return0;} |
[{"name" : "xiaoy", "age" :17} , {"name" : "xiaot", "age" : 20}]
| 1234567891011121314151617181920212223242526272829303132 |
#pragma comment(lib, "json_mtd.lib") #include <fstream>#include <cassert>#include "json/json.h" int main() { ifstream ifs; ifs.open("testjson.json"); assert(ifs.is_open()); Json::Reader reader; Json::Value root; if(!reader.parse(ifs, root,false)) { return-1; } std::string name; intage; intsize = root.size(); for(inti=0; i<size; ++i)
{ name = root[i]["name"].asString(); age = root[i]["age"].asInt(); std::cout<<name<<" "<<age<<std::endl; } return0;} |
json寫入:
| 123456789101112131415161718192021222324252627 |
#pragma comment(lib, "json_mtd.lib") #include <fstream>#include <cassert>#include "json/json.h" int main() { Json::Value root; Json::FastWriter writer; Json::Value person; person["name"] ="hello world"; person["age"] = 100; root.append(person); std::string json_file = writer.write(root); ofstream ofs; ofs.open("test1.json"); assert(ofs.is_open()); ofs<<json_file; return0;} |
結果:[{"age":100,"name":"hello world"}]
json對數組的解析還支援STL的風格。即
Json::Value::Members member;//Members 這玩意就是vector<string>,typedef了而已
for (Json::Value::iterator itr = objArray.begin(); itr!= objArray.end(); itr++)
{
member = (*itr).getMemberNames();
for (Json::Value::Members::iterator iter = member.begin(); iter!= member.end(); iter++)
{
string str_temp = (*itr)[(*iter)].asString();
}
}
此種風格與上面的類似,只是上面的只是取"text"節點,而後一種是輸出所有節點。
JSON在C/C++下的運用 及 Qt解析Json執行個體http://blog.simophin.net/?p=193