1

我正在编写一个服务器客户端程序。服务器是用 C++ 编写的,我使用 JSON 字符串来发送数据。这个库对我有很大帮助,而且一切正常,但我有一个问题:如何将 JSON 字符串数组解析为普通的 C++ 数组?我在文档中搜索了方法,但没有找到任何方法。我必须编写自己的函数吗?

例如,sJSON 字符串在哪里{"msg":"message", "content":["content1", "content2"]}

CJsonObject *obj = CJsonParser::Execute(s); 
string msg = (*obj)["msg"]->ToString();
string content = (*obj)["content"]->ToString();
cout << msg << endl; // message
cout << content << endl; // ["content1", "content2"]

但我想要一个“content1”、“content2”的数组/向量。

4

3 回答 3

2

它看起来像CJsonObject::operator[]返回一个const CJsonValue*可能指向具有动态类型的对象CJsonArray。即(*obj)["content"]返回指向类型对象的指针CJsonArray。你可以做一个dynamic_cast<CJsonArray*>来确定。

CJsonArray有一个被调用的成员函数GetValue,它接受一个std::vector<CJsonValue*>引用并用数组中的值填充它。

因此,您可以执行以下操作(未经测试):

if (auto array = dynamic_cast<const CJsonArray*>((*obj)["content"])) {
  std::vector<CJsonValue*> vec;
  array->GetValue(vec);
  for (auto& value : vec) {
    std::cout << value->ToString() << std::endl;
  }
}

或 C++03 等价物:

if (const CJsonArray* array = dynamic_cast<const CJsonArray*>((*obj)["content"])) {
  typedef std::vector<CJsonValue*> ValueVector;
  ValueVector vec;
  array->GetValue(vec);
  for (ValueVector::iterator it = vec.begin(); it != vec.end(); it++) {
    std::cout << (*it)->ToString() << std::endl;
  }
}
于 2012-12-29T14:58:33.010 回答
1

您可以检查 Json 对象的真实类型并使用强制转换来检索CJsonArray对象。

在动态转换之后,您的对象结果是一个CJsonArray,它有一个方法:getValue.

if (content.getType() == JV_ARRAY) {
  std::vector <CJsonValue*> values;

  (dynamic_cast<CJsonArray*>(content))->getValue(values);

}

value向量包含,因此CJsonValue您可以ToString()用于每个元素。

于 2012-12-29T14:59:10.120 回答
0

为此目的使用 boost::spirit 可能是一个可行的选择。JSON 是一个很容易解析的东西,你将能够通过与 boost::phoenix 的交互来填充你的数组。

于 2012-12-29T14:49:09.993 回答