0

我能够成功编译程序,但无法从 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;
}
4

2 回答 2

0

有两个问题:

  1. jsonInput 字符串不是有效的 JSON,缺少分隔对象对的逗号。
  2. 下一个问题解释起来更复杂。顶层值本身是一个对象,因此调用 val.get_obj() 返回包含所有数据的对象。此对象中只有一对,名为“请求”。调用 val.get_obj()[0] 将检索这对。然后,您需要从这对的值中取出对象。

    值 val;读取(s,val);//读取jsonInput的值

    const Pair& pair = val.get_obj()[0]; //获取名称:值对,命名为“请求”

    常量对象& obj = pair.value_.get_obj(); //获取服务,cookie...对象

于 2012-05-04T19:53:31.290 回答
0

为了简单起见,因为它们应该与 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...
        .
        .
    }
}
于 2015-06-05T12:47:00.320 回答