【问题标题】:Parsing JSON string with jsoncpp使用 jsoncpp 解析 JSON 字符串
【发布时间】:2018-04-27 06:58:59
【问题描述】:

我正在尝试解析一个用 PHP 编码并通过 TCP 发送到 C++ 客户端的 JSON 字符串。

我的 JSON 字符串是这样的:

{"1":{"name":"MIKE","surname":"TAYLOR"},"2":{"name":"TOM","surname":"JERRY"}}

在 C++ 客户端上,我使用的是 jsoncpp 库:

void decode()
{
    string text =     {"1":{"name":"MIKE","surname":"TAYLOR"},"2":{"name":"TOM","surname":"JERRY"}};
    Json::Value root;
    Json::Reader reader;
    bool parsingSuccessful = reader.parse( text, root );
    if ( !parsingSuccessful )
    {
        cout << "Error parsing the string" << endl;
    }
    const Json::Value mynames = root["name"];
    for ( int index = 0; index < mynames.size(); ++index )  
    {
        cout << mynames[index] << endl;
    }
}

问题是我没有得到任何输出,甚至没有关于解析的错误(如果有的话)。 你能帮我理解我做错了什么吗?

【问题讨论】:

  • 这段代码甚至无法编译。首先,您需要将 json 字符串转义为 C++ 字符串。如果需要更大的字符串,请参考link 解决方案
  • @kalimba 你是绝对正确的。我正在解析一个 tcp 流,但是我写了一个带有字符串的函数来解释我写的代码。我忘记了转义序列。感谢您的提醒。

标签: c++ json jsoncpp


【解决方案1】:

你的问题是:没有root["name"]。你的文档应该是这样的:

{ "people": [{"id": 1, "name":"MIKE","surname":"TAYLOR"}, {"id": 2, "name":"TOM","surname":"JERRY"} ]}

你的代码是这样的:

void decode()
{
    string text ="{ \"people\": [{\"id\": 1, \"name\":\"MIKE\",\"surname\":\"TAYLOR\"}, {\"id\": 2, \"name\":\"TOM\",\"surname\":\"JERRY\"} ]}";
    Json::Value root;
    Json::Reader reader;
    bool parsingSuccessful = reader.parse( text, root );
    if ( !parsingSuccessful )
    {
        cout << "Error parsing the string" << endl;
    }

    const Json::Value mynames = root["people"];

    for ( int index = 0; index < mynames.size(); ++index )
    {
        cout << mynames[index] << endl;
    }
}

如果您想保持数据不变:

void decode()
{
  //string text ="{ \"people\": [{\"id\": 1, \"name\":\"MIKE\",\"surname\":\"TAYLOR\"}, {\"id\": 2, \"name\":\"TOM\",\"surname\":\"JERRY\"} ]}";
  string text ="{ \"1\": {\"name\":\"MIKE\",\"surname\":\"TAYLOR\"}, \"2\": {\"name\":\"TOM\",\"surname\":\"JERRY\"} }";
  Json::Value root;
  Json::Reader reader;
  bool parsingSuccessful = reader.parse( text, root );
  if ( !parsingSuccessful )
  {
    cout << "Error parsing the string" << endl;
  }

  for( Json::Value::const_iterator outer = root.begin() ; outer != root.end() ; outer++ )
  {
    for( Json::Value::const_iterator inner = (*outer).begin() ; inner!= (*outer).end() ; inner++ )
    {
      cout << inner.key() << ": " << *inner << endl;
    }
  }
}

使用迭代器直接遍历根对象(不要把它当作一个数组。

如果 Json::Reader 不起作用,请尝试 Json::CharReader

void decode()
{
  string text ="{\"1\":{\"name\":\"MIKE\",\"surname\":\"TAYLOR\"},\"2\":{\"name\":\"TOM\",\"surname\":\"JERRY\"}}";

  Json::CharReaderBuilder builder;
  Json::CharReader * reader = builder.newCharReader();

  Json::Value root;
  string errors;

  bool parsingSuccessful = reader->parse(text.c_str(), text.c_str() + text.size(), &root, &errors);
  delete reader;

  if ( !parsingSuccessful )
  {
    cout << text << endl;
    cout << errors << endl;
  }

  for( Json::Value::const_iterator outer = root.begin() ; outer != root.end() ; outer++ )
  {
    for( Json::Value::const_iterator inner = (*outer).begin() ; inner!= (*outer).end() ; inner++ )
    {
      cout << inner.key() << ": " << *inner << endl;
    }
  }
}

【讨论】:

  • 感谢您的回答,先生。我对给出的答案有一些问题,请。 1)为什么我需要这样写文本字符串?我的字符串直接来自 php json_encode,所以它应该是正确的 2)如果我想将关联数组保留为 "1":{},"2":{} ,我可以这样做并在前面加上根“人们” ?我有点困惑。
  • 用代码做了一些测试,问题出在 bool parsingSuccessful = reader.parse( text, root );看起来 nothings 被执行超过那条线。可能是因为不推荐使用 Json::Reader reader 吗?请注意,我没有编译器错误。
  • 这里还有一个例子:neverfriday.com/2013/07/26/learning-jsoncpp
  • 使用 C++11 特性:R 前缀生成原始字符串。
  • Json::Reader() 显示为已弃用;使用 CharReader 和 CharReaderBuilder。
【解决方案2】:

你也可以从字符串流中读取:

std::stringstream sstr(stringJson);
Json::Value json;
sstr >> json;

【讨论】:

    猜你喜欢
    • 2013-09-24
    • 1970-01-01
    • 2011-12-28
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多