Как вставить карту или вектор для генерации строки json (jsoncpp)

Привет, я хотел бы сделать что-то простое с помощью lib jsoncpp, например:

std::map<int,string> mymap;
mymap[0]="zero";
mymap[1]= "one";

Json::Value root;
root["teststring"] = "m_TestString"; //it  works
root["testMap"] = mymap; //it does not work

Json::StyledWriter writer;
string output = writer.write( root );

Ошибка: ошибка C2679: двоичный файл '=': не найден оператор, который принимает правый операнд типа 'std::map‹_Kty,_Ty>'

У вас есть идея решить эту проблему? Я так понимаю, что json::value не может принять карту, но для создания json файла она должна быть, верно? большое спасибо


person Zaibacker    schedule 10.06.2014    source источник


Ответы (2)


Да, это не работает, так как Json::Value принимает только общие типы или другой Json::Value. Таким образом, вы можете попробовать использовать Json::Value вместо std::map.

Json::Value mymap;
mymap["0"] = "zero";
mymap["1"] = "one";

Json::Value root;
root["teststring"] = "m_TestString"; // it works
root["testMap"]    = mymap;          // works now

Json::StyledWriter writer;
const string output = writer.write(root);

Это должно сделать работу. Если вам действительно нужно использовать std::map<int, std::string>, вам придется сначала преобразовать его в Json::Value. Это будет что-то вроде (псевдо-непроверенный код):

std::map<int, std::string> mymap;
mymap[0] = "zero";
mymap[1] = "one";

// conversion of std::map<int, std::string> to Json::Value
Json::Value jsonMap;
std::map<int, std::string>::const_iterator it = mymap.begin(), end = mymap.end();
for ( ; it != end; ++it) {
    jsonMap[std::to_string(it->first)] = it->second;
    // ^ beware: std::to_string is C++11
}

Json::Value root;
root["teststring"] = "m_TestString";
root["testMap"]    = jsonMap; // use the Json::Value instead of mymap

Json::StyledWriter writer;
const string output = writer.write(root);
person AquilaRapax    schedule 10.06.2014
comment
Большое спасибо, он работает отлично, просто изменив в вашем ответе it.first на (*.it).first , иначе он не строится. - person Zaibacker; 10.06.2014
comment
Ах хорошо... я не проверял код Извините за это, я исправлю его;) - person AquilaRapax; 10.06.2014

Та же проблема приходит ко мне сегодня. Надеюсь, поможет.

как написать шаблон, преобразующий вектор в Json::Value (jsoncpp)

person tryer3000    schedule 06.11.2014