2010-07-19 70 views
0

不知道該怎麼解釋呢 - 我很新的C++,但是......讓我試試:C++:如何實現(像)JSON

比方說,我有300多個名字(傑夫傑克...)與300 + int值(0或1)。在JS中,我會使用JSON。這樣的事情:

var people = {"person": [ 
       {"name": "Jeff","val": 0}, 
       {"name": "Jill","val": 1}, 
       {"name": "Jack","val": 0}, 
       {"name": "Jim","val": 1}, 
       {"name": "John","val": 0} 
]} 

在C++中這樣做的最好方法是什麼? 謝謝。

+3

我會建議你不要實施類似** JSON的東西:使用現有的庫或實現真正的JSON標準。 – ereOn 2010-07-19 07:35:40

+3

你想要什麼?數據結構的文本表示?或者只是用這些數據寫一個「文字」? – dan04 2010-07-19 07:36:37

+2

你的問題是什麼?你想*存儲*或*解析*這些數據? – Philipp 2010-07-19 07:40:24

回答

5

如果你能有重名不能使用地圖,這樣你就可以使用這樣的事情:

struct Person 
{ 
    Person(const std::string & n, int v) : name(n), val(v) {} 
    std::string name; 
    int val; 
}; 

int main() 
{ 
std::vector<Person> people; 

people.push_back(Person("Jeff", 0)); 
people.push_back(Person("Jill", 1)); 
... 

} 

如果你想獨特的名字,你可以做這樣的事情:

std::map<std::string, int> people; 
people["Jeff"] = 0; 
people["Jill"] = 1; 

std::map<std::string, Person> people; 
people["Jeff"] = Person("Jeff",0); 
people["Jill"] = Person("Jill",1); 

如果您使用此代碼很多,你可以清理重複的殘餘。

template<typename K, typename V> 
struct BuildMap 
{ 
    BuildMap() : map_() {} 
    BuildMap<K,V>& operator()(const K & key, const V & value) 
    { 
    map_[key]=value; 
    return *this; 
    } 
    std::map<K,V> operator()() { return map_; } 
    std::map<K,V> map_; 
}; 

std::map<std::string,int> people = BuildMap<std::string,int>() 
    ("Jeff", 0) 
    ("Jill", 1) 
    ("John", 1) 
(); 

希望這給你一些想法。

+1

或者只是使用Boost.Assign來緩解初始化。 – 2010-07-19 08:58:39

+0

@Georg:非常棒的圖書館,一直在尋找類似這樣的東西。另一個方便的助力util。下面是鏈接:http://www.boost.org/doc/libs/1_43_0/libs/assign/doc/index.html – 2010-07-19 09:46:03

+0

不錯的'BuildMap'類! +1。 – Linuxios 2012-06-12 22:43:55

0

試試看std :: map。

點擊這裏 http://www.cplusplus.com/reference/stl/map/

這是一個關聯容器類似於字典。像這樣?

#include <map> 
#include <string> 

std::map<string,int> person; 

void initPeople(){ 
    person["Jeff"] = 0; 
    person["Jill"] = 1; 
    person["Jack"] = 0; 
    person["Jim"] = 1; 
    person["John"] = 0; 
} 
+1

這假定名稱是唯一的,並且原始順序無關緊要。 OP沒有具體說明。 – dan04 2010-07-19 07:57:20

+0

名稱是唯一的,順序無關緊要。我只需要手動編寫它並通過隨機數訪問 - 例如返回people.person [rndnumber] .name並返回people.person [NOTrndnumber] .val。 – 2010-07-19 08:34:24

4

看看jsoncpp - 它是一個輕量級的JSON解析器,這使得它很容易在你的C++項目中使用JSON。

http://sourceforge.net/projects/jsoncpp/

然後你就可以創建一個文本文件,寫JSON格式的某些條目那裏,然後在你的C++程序打開該文件。有很多關於如何使用jsoncpp做的教程。

+0

看起來不錯,但我在C++中吸收太多,所以我不知道如何使用/實現它。我只需要一個包含300多個獨特單詞和值(1或0 ==> true/false)的數組(?),並且能夠輕鬆訪問它。在JS中它很容易 - 只需創建一個對象並通過people.person [X] .name訪問它。但是,謝謝您的建議。 :) – 2010-07-19 08:45:06