使用 minijson-reader 库读取 JSON 字符串时出现问题

problem reading json string with minijson-reader library

本文关键字:问题 字符串 JSON minijson-reader 读取 使用      更新时间:2023-10-16

在尝试解析我的 c++ 代码中的 json 字符串时,使用 minijson 库,到目前为止,我得到了这样的代码:

<<"version">> [&]() { result.setVersion(v.as_long()); }
<<"capabilities">> [&]()
{
parse_array(ctx, [&](value capability)
{
result.getCapabilities().push_back(capability.as_string());
});
}

数据应存储在以下struct

struct block_template {
int version;
vector<string> capabilities;
...
}

version值存储正确,但矢量大小保持为 0。我尝试可视化从 json 字符串(带cout << capability.as_string() << endl(读取的数据,并且它显示正确,只是没有存储在数据结构中。

任何已经使用过这个库的人都可以提示这里出了什么问题?

由于 OP 要求在注释中使用其他库的示例,因此我将更笼统地回复。

在 jsoncons 中,如果 JSON 成员名称和C++变量名称相同,则可以使用宏JSONCONS_ALL_MEMBER_TRAITS来设置映射,

#include <iostream>
#include <jsoncons/json.hpp>
struct block_template {
int version;
std::vector<std::string> capabilities;
};
JSONCONS_ALL_MEMBER_TRAITS(block_template, version, capabilities)
int main()
{
std::string input = R"(
{
"version" : 1,
"capabilities" : ["foo","bar","baz"]
}
)";
auto result = jsoncons::decode_json<block_template>(input);
std::cout << "(1)n" << "version: " << val.version << "n";
for (auto& item : val.capabilities)
{
std::cout << "item: " << item << "n";
}
std::string output;
jsoncons::encode_json(val, output, jsoncons::indenting::indent);
std::cout << "(2)n" << output << "nn";
}

输出:

(1)
version: 1
item: foo
item: bar
item: baz
(2)
{
"capabilities": ["foo", "bar", "baz"],
"version": 1
}

如果 JSON 和C++名称不同,则可以改用宏JSONCONS_ALL_MEMBER_NAME_TRAITS

JSONCONS_ALL_MEMBER_NAME_TRAITS(block_template, (version,"Version"), 
(capabilities,"Capabilities"))

通过此更改,输出将变为:

(1)
version: 1
item: foo
item: bar
item: baz
(2)
{
"Capabilities": ["foo", "bar", "baz"],
"Version": 1
}

有关将JSON解码为C++数据结构并重新编码的库的更多示例,请参阅此答案,包括Martin York有趣的ThorsSerializer。