我正在尝试使用 RapidJSON 解析从服务器接收的数据。以下是收到的确切字符串:
[
{
"Node": "9478149a08f9",
"Address": "172.17.0.2",
"ServiceID": "HSS",
"ServiceName": "HSS",
"ServiceTags": [],
"ServiceAddress": "",
"ServicePort": 6666,
"ServiceEnableTagOverride": false,
"CreateIndex": 2855,
"ModifyIndex": 2855
}
]
Run Code Online (Sandbox Code Playgroud)
以下是代码
int main(void)
{
CURL *curl;
CURLcode res;
struct MemoryStruct chunk;
chunk.memory = (char *)malloc(1); /* will be grown as needed by the realloc above */
chunk.size = 0; /* no data at this point */
/* In windows, this will init the winsock stuff */
curl_global_init(CURL_GLOBAL_ALL);
/* get a curl handle */
curl = curl_easy_init();
if(curl) {
/* First set the URL that is about to receive our POST. This URL can
just as well be a https:// URL if that is what should receive the
data. */
curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:8500/v1/catalog/service/HSS");
/* Now specify the POST data */
// Set the callbackfunction to handle the JSON string
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &chunk);
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
/* always cleanup */
curl_easy_cleanup(curl);
}
std::string str;
str.assign(chunk.memory,chunk.size);
cout<<"The string response is :"<<str<<endl;
Document d;
d.Parse(str.c_str());
assert(d.IsObject());
Run Code Online (Sandbox Code Playgroud)
<-- 这里失败了
JSON 数据有效,但不确定为什么仍然失败。
您的 JSON 字符串是数组。所以如果你检查IsObject()它失败了。仔细看一下这个JSON字符串,你会发现你关心的是 in [],这表明它是一个数组。
摘自JSON官方网站:
数组以 [(左括号)开始,以 ](右括号)结束。值由 ,(逗号)分隔。
尝试以下代码:
string str_json = "[{\"Node\":\"9478149a08f9\",\"Address\":\"172.17.0.2\",\"ServiceID\":\"HSS\",\"ServiceName\":\"HSS\",\"ServiceTags\":[],\"ServiceAddress\":\"\",\"ServicePort\":6666,\"ServiceEnableTagOverride\":false,\"CreateIndex\":2855,\"ModifyIndex\":2855}]";
rapidjson::Document doc;
doc.Parse(str_json.c_str());
//assert(doc.IsObject());
if(doc.IsArray()){
cout << "is array" << endl;
}
for(Value::ConstValueIterator itr = doc.Begin(); itr != doc.End(); ++itr){
const Value& obj = *itr;
for(Value::ConstMemberIterator it = obj.MemberBegin(); it != obj.MemberEnd(); ++it){
if(it->value.IsString()){
cout << it->name.GetString() << ": " << it->value.GetString() << endl;
}
// other codes...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13009 次 |
| 最近记录: |