Проблема использования json_spirit
Я был в состоянии успешно скомпилировать программу, но не смог получить значения из объекта JSON. Я вставляю код ниже, код прост, любая помощь приветствуется.
#include <cstdio>
#include <cstring>
#include <json_spirit.h>
using namespace std;
using namespace json_spirit;
//A sample get file request
char *jsonInput =
"{\"request\" : { \
\"service\" : \"fmgr\" \
\"cookie\" : \"Abxruyyeziyrolsu\" \
\"req\" : \"read\" \
\"fname\" : \"Junk.txt\" \
\"size\" : 1024 \
\"data\" : \"data\" \
}}";
int main(int argc, char **argv)
{
Value val;
const string s = jsonInput;
read(s, val); //read the jsonInput to the value
Object obj = val.get_obj();
std::string service, cookie, req, fname, data;
uint32_t size;
for(Object::size_type i = 0; i != obj.size(); ++i) {
const Pair& pair = obj[i];
const string& name = pair.name_;
const Value& value = pair.value_;
if( name == "service" ) service = value.get_str();
else if( name == "cookie") cookie = value.get_str();
else if( name == "req" ) req = value.get_str();
else if( name == "fname" ) fname = value.get_str();
else if( name == "size" ) size = value.get_int();
else if( name == "data" ) data = value.get_str();
}
std::cout<<service << " " << cookie << " " << req << " " << fname << " " << size << " " << data ;
return 0;
}
2 ответа
Для простоты, как и в случае с json_spirit, попробуйте следующее после исправления пропущенных разделителей ',' в строке JSON.
std::string json_input = <your valid JSON string>
json_spirit::Value value;
auto success = json_spirit::read_string(json_input, value);
if (success == true) {
auto object = value.get_obj();
for (auto entry : object) {
if (entry.name_ == "service") service = entry.value_.get_str();
else if...
.
.
}
}
Есть две проблемы:
- Строка jsonInput не является допустимой JSON, запятые для разделения пар объектов отсутствуют.
Следующий вопрос более сложен для объяснения. Значение верхнего уровня само по себе является объектом, поэтому вызов val.get_obj() возвращает объект, содержащий все данные. В этом объекте есть только одна пара с именем "request". Вызов val.get_obj()[0] вернет эту пару. Затем вам нужно получить объект из значения этой пары.
Значение val; читать (s, val); // читаем jsonInput к значению
const Pair& pair = val.get_obj()[0]; // получает пару имя: значение с именем "запрос"
const Object & obj = pair.value_.get_obj (); // получает сервис, cookie... объект