json_spirit使用问题

时间:2012-04-23 13:10:14

标签: json 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 个答案:

答案 0 :(得分:0)

有两个问题:

  1. jsonInput字符串无效JSON,缺少分隔对象对的逗号。
  2. 下一个问题要解释得更复杂。 toplevel Value本身就是一个Object,因此调用val.get_obj()会返回包含所有数据的Object。此对象中只有一个Pair,名为“request”。调用val.get_obj()[0]将检索此对。然后,您需要从此Pair的值中获取Object。

    价值val;读(s,val); //将jsonInput读取为值

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

    const Object&amp; obj = pair.value_.get_obj(); //获取服务,cookie ...对象

答案 1 :(得分: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...
        .
        .
    }
}