2013-01-23 14 views
10

Chcę móc utworzyć następujące dane wyjściowe JSON, używając rapidJSONrapidJSON dodanie tablicę kodowanym

{ 
    "year": 2013, 
    "league": "national", 
    "teams": [ 
     { 
      "teamname": "reds", 
      "teamcity": "cincinnati", 
      "roster": [ 
       { 
        "playername": "john", 
        "position": "catcher" 
       }, 
       { 
        "playername": "joe", 
        "position": "pitcher" 
       } 
      ] 
     } 
    ] 
} 

To jest ważne JSON ... zweryfikowana w JSONLint.com wiem, jak utworzyć dokument i użyj AddMember, aby dodać "rok" i "ligę".

nie mogę dowiedzieć się, i nie spotkała się z przykładami, jak dodać tablicę, która ma strukturę jak „zespołów” lub „zaplanowany”

Jak można dodać „zespoły”, która jest tablicą struktur ? Każda pomoc lub wskaż mi przykład może być świetna.

+0

Jeżeli zaakceptowali odpowiedź – warunanc

Odpowiedz

42

Załóżmy, że mamy std :: wektor zawierający funkcje PlayerName() i Postion() w klasie Roster, które zwracają std :: string &.

rapidjson::Document jsonDoc; 
jsonDoc.SetObject(); 
rapidjson::Value myArray(rapidjson::kArrayType); 
rapidjson::Document::AllocatorType& allocator = jsonDoc.GetAllocator(); 

std::vector<Roster*>::iterator iter = roster.begin(); 
std::vector<Roster*>::iterator eiter = roster.end(); 
for (; iter != eiter; ++iter) 
{ 
    rapidjson::Value objValue; 
    objValue.SetObject(); 
    objValue.AddMember("playername", (*iter)->PlayerName().c_str(), allocator); 
    objValue.AddMember("position", (*iter)->Position().c_str(), allocator); 

    myArray.PushBack(objValue, allocator); 
} 

jsonDoc.AddMember("array", myArray, allocator); 
rapidjson::StringBuffer strbuf; 
rapidjson::Writer<rapidjson::StringBuffer> writer(strbuf); 
jsonDoc.Accept(writer); 

const char *jsonString = strbuf.GetString(); // to examine the encoding... 

To da ci zestaw struktur w dokumencie. Wszystko, co powinieneś zrobić, aby uzyskać resztę struktury, to zagnieździć obiekty rapidjson w sobie nawzajem i użyć funkcji AddMember() do zbudowania złożonego drzewa obiektów. Mam nadzieję że to pomoże.

+2

Nice one! Niestety użytkownik nie zaakceptował twojej odpowiedzi, zresztą zrobiłeś mój dzień! :) – Zappescu

+0

Idealnie oszczędziłem mój czas. powinien zaakceptować twoją odpowiedź –

+0

Jest to solidny cały przykład, z którego można wyciągnąć. –

10

W Vs2012/Rapidjson wersja 0.1, następująca instrukcja otrzymuje nieczytelny kod, gdy dokument wyjściowy z StringBuffer.

objValue.AddMember("position", (*iter)->Position().c_str(), allocator); 

po kilkugodzinnym wykopalisku zrozumiałem, jak to zrobić w prawidłowy sposób.

Value tmp; 
tmp.SetString((*iter)->Position().c_str(), allocator); 
objValue.AddMember("position", tmp, allocator); 

tutaj jest tutorial: http://miloyip.github.io/rapidjson/md_doc_tutorial.html

1
rapidjson::StringBuffer s; 
    rapidjson::Writer<rapidjson::StringBuffer> writer(s); 

    writer.StartObject();    

    std::string year("year"); 
    writer.String(year.c_str(), static_cast<rapidjson::SizeType>(year.length())); 
    writer.Int(2013); 

    std::string league("league"); 
    writer.String(league.c_str(), static_cast<rapidjson::SizeType>(league.length())); 
    std::string national("national"); 
    writer.String(national.c_str(), static_cast<rapidjson::SizeType>(national.length())); 


    std::string teams("teams"); 
    writer.String(teams.c_str(), static_cast<rapidjson::SizeType>(teams.length())); 

    writer.StartArray(); 
    writer.StartObject(); 

    std::string teamname("teamname"); 
    writer.String(teamname.c_str(), static_cast<rapidjson::SizeType>(teamname.length())); 
    std::string reds("reds"); 
    writer.String(reds.c_str(), static_cast<rapidjson::SizeType>(reds.length())); 

    std::string teamcity("teamcity"); 
    writer.String(teamcity.c_str(), static_cast<rapidjson::SizeType>(teamcity.length())); 
    std::string cincinnati("cincinnati"); 
    writer.String(cincinnati.c_str(), static_cast<rapidjson::SizeType>(cincinnati.length())); 

    std::string roster("roster"); 
    writer.String(roster.c_str(), static_cast<rapidjson::SizeType>(roster.length())); 

    writer.StartArray(); 

    writer.StartObject(); 
    std::string playername("playername"); 
    writer.String(playername.c_str(), static_cast<rapidjson::SizeType>(playername.length())); 
    std::string john("john"); 
    writer.String(john.c_str(), static_cast<rapidjson::SizeType>(john.length())); 

    std::string position("position"); 
    writer.String(position.c_str(), static_cast<rapidjson::SizeType>(position.length())); 
    std::string catcher("catcher"); 
    writer.String(catcher.c_str(), static_cast<rapidjson::SizeType>(catcher.length())); 
    writer.EndObject(); 

    // can add one more object in the same manner 
    // with player name and position 

    writer.EndArray(); 

    writer.EndObject(); 

    writer.EndArray(); 
    writer.EndObject(); 


s.GetString();