gpt4 book ai didi

c++ - 使用 jsoncpp 从 JSON 中获取节点的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:48 30 4
gpt4 key购买 nike

我正在尝试使用 jsoncpp 来解析一组 json。 json 是从网页生成的,其中包含来自 django 对象的 simplejson。我使用 libcurl 从特定 URL 获取它。当我在根目录上使用 toStyledString() 函数时,我将其打印出来。

[
{
"fields" : {
"desc" : "Carol King test",
"format" : "1",
"genre" : "Pop",
"mount" : "CarolKing",
"name" : "Carol King",
"protocol" : "0",
"songs" : [ 27, 28, 29, 30, 31, 32, 33, 34 ],
"url" : "http://192.168.0.5:8000/CarolKing"
},
"model" : "music.playlist",
"pk" : 2
}
]

所以看起来我正在获取正确的数据并且它在 Json::Value 类中。

问题是我无法从 json 结构中获取特定节点。这是我使用的代码。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sstream>
#include <curl/curl.h>
#include <string>
#include "Parameter.h"
#include "lib_json/json.h"

using namespace std;

static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
cout << "-->write_data " << endl;
string buf = string(static_cast<char *>(ptr), size *nmemb);
stringstream * response = static_cast<stringstream *>(stream);
response->write(buf.c_str(), (streamsize)buf.size());
return size * nmemb;

}


int main(int sys_argc, char ** sys_argv) {
CURL *curl;
CURLcode res;
stringstream response;
string error;

char ** argv = sys_argv;


string file = argv[1];
Parameter *parms = new Parameter(file);
parms->ReadParameters();

cout << "URL: " << parms->GetParameter("URL");


curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_URL, parms->GetParameter("URL").c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
res = curl_easy_perform(curl);

cout << "Playlists-JSON: " << response.str() << endl;
curl_easy_cleanup(curl);
}

Json::Value root;
Json::Reader reader;

bool parsingSuccessful = reader.parse(response.str(), root);

if(!parsingSuccessful)
{
cout << "Failed to parse configuration. " << reader.getFormatedErrorMessages();
return 16;
}

cout << "Pretty-Print: " << root.toStyledString() << endl;
const Json::Value fields = root["fields"]["songs"];


return 0;
}

因为另一个问题我没有使用实际的 libjson.so 共享库,我只是拉入文件并用我的源代码编译它们(我猜这很糟糕,但那个问题不是重点这个问题)。以下是我的 src 文件夹的结构。

.:
bird Bird.cpp fopen.cpp fopen.h lib_json Parameter.cpp Parameter.h

./lib_json:
autolink.h features.h json_batchallocator.h json_internalarray.inl json_reader.cpp json_valueiterator.inl reader.h value.h
config.h forwards.h json.h json_internalmap.inl json_value.cpp json_writer.cpp sconscript writer.h

这是 make 的输出。

    munderwo@bertha:/local/Documents/inthebackground/Box/Bird/bird/Debug$ make
Building file: ../src/lib_json/json_reader.cpp
Invoking: GCC C++ Compiler
g++ -I"/local/Documents/inthebackground/Box/Bird/bird/Libraries/i386/include" -I"/local/Documents/inthebackground/Box/Bird/bird/src" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/lib_json/json_reader.d" -MT"src/lib_json/json_reader.d" -o"src/lib_json/json_reader.o" "../src/lib_json/json_reader.cpp"
Finished building: ../src/lib_json/json_reader.cpp

Building file: ../src/lib_json/json_value.cpp
Invoking: GCC C++ Compiler
g++ -I"/local/Documents/inthebackground/Box/Bird/bird/Libraries/i386/include" -I"/local/Documents/inthebackground/Box/Bird/bird/src" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/lib_json/json_value.d" -MT"src/lib_json/json_value.d" -o"src/lib_json/json_value.o" "../src/lib_json/json_value.cpp"
Finished building: ../src/lib_json/json_value.cpp

Building file: ../src/lib_json/json_writer.cpp
Invoking: GCC C++ Compiler
g++ -I"/local/Documents/inthebackground/Box/Bird/bird/Libraries/i386/include" -I"/local/Documents/inthebackground/Box/Bird/bird/src" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/lib_json/json_writer.d" -MT"src/lib_json/json_writer.d" -o"src/lib_json/json_writer.o" "../src/lib_json/json_writer.cpp"
Finished building: ../src/lib_json/json_writer.cpp

Building file: ../src/Bird.cpp
Invoking: GCC C++ Compiler
g++ -I"/local/Documents/inthebackground/Box/Bird/bird/Libraries/i386/include" -I"/local/Documents/inthebackground/Box/Bird/bird/src" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Bird.d" -MT"src/Bird.d" -o"src/Bird.o" "../src/Bird.cpp"
Finished building: ../src/Bird.cpp

Building file: ../src/Parameter.cpp
Invoking: GCC C++ Compiler
g++ -I"/local/Documents/inthebackground/Box/Bird/bird/Libraries/i386/include" -I"/local/Documents/inthebackground/Box/Bird/bird/src" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Parameter.d" -MT"src/Parameter.d" -o"src/Parameter.o" "../src/Parameter.cpp"
../src/Parameter.cpp: In member function ‘int Parameter::ReadParameters()’:
../src/Parameter.cpp:47: warning: comparison between signed and unsigned integer expressions
Finished building: ../src/Parameter.cpp

Building file: ../src/fopen.cpp
Invoking: GCC C++ Compiler
g++ -I"/local/Documents/inthebackground/Box/Bird/bird/Libraries/i386/include" -I"/local/Documents/inthebackground/Box/Bird/bird/src" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/fopen.d" -MT"src/fopen.d" -o"src/fopen.o" "../src/fopen.cpp"
Finished building: ../src/fopen.cpp

Building target: Bird
Invoking: GCC C++ Linker
g++ -L"/local/Documents/inthebackground/Box/Bird/bird/Libraries/i386/lib" -o"Bird" ./src/lib_json/json_reader.o ./src/lib_json/json_value.o ./src/lib_json/json_writer.o ./src/Bird.o ./src/Parameter.o ./src/fopen.o -lcurl
Finished building target: Bird

当我执行 Bird 时,我从所有这些中得到以下输出

*Bird: ../src/lib_json/json_value.cpp:1025: Json::Value& Json::Value::resolveReference(const char*, bool): Assertion `type_ == nullValue || type_ == objectValue' failed.*
URL: 127.0.0.1:8000/playlist-->write_data
Playlists-JSON: [{"pk": 2, "model": "music.playlist", "fields": {"protocol": "0", "name": "Carol King", "format": "1", "url": "http://192.168.0.5:8000/CarolKing", "mount": "CarolKing", "genre": "Pop", "songs": [27, 28, 29, 30, 31, 32, 33, 34], "desc": "Carol King test"}}]
Pretty-Print: [
{
"fields" : {
"desc" : "Carol King test",
"format" : "1",
"genre" : "Pop",
"mount" : "CarolKing",
"name" : "Carol King",
"protocol" : "0",
"songs" : [ 27, 28, 29, 30, 31, 32, 33, 34 ],
"url" : "http://192.168.0.5:8000/CarolKing"
},
"model" : "music.playlist",
"pk" : 2
}
]

如果我注释掉这一行,我就不会遇到问题

const Json::Value fields = root["songs"];

我完全接受我在这里做错事的事实。但我只是不知道它是什么。那么是什么导致了错误:

Bird: ../src/lib_json/json_value.cpp:1025: Json::Value& Json::Value::resolveReference(const char*, bool): Assertion `type_ == nullValue || type_ == objectValue' failed.

感谢您提供的任何帮助。

干杯

标记

最佳答案

所以这又是一个不理解发生了什么的情况。

因为我的 json 结构来自 Django 模型,它实际上是 json 数组(我知道我会在这里弄错术语,我提前道歉)。这可以从以下代码中找到:

cout << "type: " << root.type() << endl;

输出如下

type: 6

在jsoncpp中,这意味着一个json数组。这也可以从开始和结束方括号的 Styledoutput 中推断出来。同样来自从第 23 行开始的 value.h 中的枚举

enum ValueType
{
nullValue = 0, ///< 'null' value
intValue, ///< signed integer value
uintValue, ///< unsigned integer value
realValue, ///< double value
stringValue, ///< UTF-8 string value
booleanValue, ///< bool value
arrayValue, ///< array value (ordered list)
objectValue ///< object value (collection of name/value pairs).
};

这很难说,因为当时我的 Django 模型只有一行数据。据我现在的理解,当我真的需要先选择初始数组位置时,我正在尝试对 objectValue 类型的 json 结构进行操作。

所以要真正获得 url,我需要做这样的事情。

for(int i = 0; i < root.size(); i++)
{
cout << root[i]["fields"]["url"].asString() << endl;
}

你会得到什么

http://192.168.0.5:8000/CarolKing
http://192.168.0.5:8000/CarolKing2

来自以下json

[
{
"fields" : {
"desc" : "Carol King test",
"format" : "1",
"genre" : "Pop",
"mount" : "CarolKing",
"name" : "Carol King",
"protocol" : "0",
"songs" : [ 27, 28, 29, 30, 31, 32, 33, 34 ],
"url" : "http://192.168.0.5:8000/CarolKing"
},
"model" : "music.playlist",
"pk" : 2
},
{
"fields" : {
"desc" : "Second carol King",
"format" : "1",
"genre" : "Pop",
"mount" : "CarolKing2",
"name" : "Carol King 2",
"protocol" : "0",
"songs" : [ 26, 27, 28, 29, 30 ],
"url" : "http://192.168.0.5:8000/CarolKing2"
},
"model" : "music.playlist",
"pk" : 35
}
]

我把它放在这里,这样如果其他人遇到这个,他们至少可以通过某种方式找出问题所在。

干杯

标记

关于c++ - 使用 jsoncpp 从 JSON 中获取节点的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4438805/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com