如何在现代 C++ 中迭代 JSON 中的 JSON
How to iterate over a JSON in JSON for modern c++
我想遍历 json 对象中的每个条目,但我一个接一个地收到无法理解的错误。如何更正以下示例?
#include <iostream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
void bla(std::string a) {
std::cout << a << '\n';
}
int main() {
json RecentFiles;
RecentFiles["1"]["Name"] = "test1.txt";
RecentFiles["1"]["Last modified"] = "monday";
RecentFiles["1"]["Score"] = 5.0f;
RecentFiles["2"]["Name"] = "test2.txt";
RecentFiles["2"]["Last modified"] = "tuesday";
RecentFiles["2"]["Score"] = 5.0f;
for (auto it = RecentFiles.begin(); it != RecentFiles.end(); ++it) {
bla("JSON: Recent file = " + it.value()["Name"]);
}
std::cout << RecentFiles; }
错误:
prog.cc: In function 'int main()':
prog.cc:18:31: error: invalid conversion from 'const char*' to 'nlohmann::detail::iter_impl<nlohmann::basic_json<> >::difference_type {aka long int}' [-fpermissive]
std::cout << it["Name"];
^
In file included from prog.cc:2:0:
./nlohmann/json.hpp:4418:15: note: initializing argument 1 of 'nlohmann::detail::iter_impl<BasicJsonType>::reference nlohmann::detail::iter_impl<BasicJsonType>::operator[](nlohmann::detail::iter_impl<BasicJsonType>::difference_type) const [with BasicJsonType = nlohmann::basic_json<>; nlohmann::detail::iter_impl<BasicJsonType>::reference = nlohmann::basic_json<>&; nlohmann::detail::iter_impl<BasicJsonType>::difference_type = long int]'
reference operator[](difference_type n) const
^
以上是在沙盒中完成的
https://wandbox.org/permlink/LNck7Gktm14bmPy0
这不是我正在使用的实际代码,我只是想看看我是否可以理解如何使用 JSON 来完成我需要做的各种基本事情。
目前我理解的太少了,我不知道我所做的是否本质上是正确的,只是因为一些愚蠢的事情而中断,或者我是否做的事情根本上是错误的。
nlohmann json 库将自己宣传为“JSON for modern C++”,并渴望表现得“就像一个 STL 容器”。然而,在 C++ 标准库中没有容器既是“类向量”又是“类映射”,并且支持值上的 begin/end 迭代器和 [= 上的 begin/end 迭代器28=]对。所以需要一些新东西。
nlohmann 最初的解决方案是复制 jsoncpp 的方法,它支持 begin/end 迭代器用于 json 数组,并向迭代器添加一个明显不标准的 key()
函数还支持 json 个对象。所以你可以写
for (auto it = RecentFiles.begin(); it != RecentFiles.end(); ++it)
{
std::cout << it.key() << "\n";
std::cout << (*it)["Name"].get<std::string>() << "\n";
std::cout << (*it)["Last modified"].get<std::string>() << "\n";
}
但作为迭代 key/values 的非标准方式,这没有标准库支持基于范围的循环 key/values。
nlohmann 后来添加了 json::items()
函数,该函数支持使用标准迭代器对 json 对象进行迭代,并且确实具有对基于范围的 for 循环的标准库支持,即
int main()
{
json RecentFiles;
RecentFiles["1"]["Name"] = "test1.txt";
RecentFiles["1"]["Last modified"] = "monday";
RecentFiles["1"]["Score"] = 5.0f;
RecentFiles["2"]["Name"] = "test2.txt";
RecentFiles["2"]["Last modified"] = "tuesday";
RecentFiles["2"]["Score"] = 5.0f;
for (const auto& item : RecentFiles.items())
{
std::cout << item.key() << "\n";
for (const auto& val : item.value().items())
{
std::cout << " " << val.key() << ": " << val.value() << "\n";
}
}
std::cout << "\nor\n\n";
for (const auto& item : RecentFiles.items())
{
std::cout << item.key() << "\n";
std::cout << " " << item.value()["Name"].get<std::string>() << "\n";
std::cout << " " << item.value()["Last modified"].get<std::string>() << "\n";
std::cout << " " << item.value()["Score"].get<double>() << "\n";
}
}
输出:
1
Last modified: "monday"
Name: "test1.txt"
Score: 5.0
2
Last modified: "tuesday"
Name: "test2.txt"
Score: 5.0
or
1
test1.txt
monday
5
2
test2.txt
tuesday
5
我想遍历 json 对象中的每个条目,但我一个接一个地收到无法理解的错误。如何更正以下示例?
#include <iostream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
void bla(std::string a) {
std::cout << a << '\n';
}
int main() {
json RecentFiles;
RecentFiles["1"]["Name"] = "test1.txt";
RecentFiles["1"]["Last modified"] = "monday";
RecentFiles["1"]["Score"] = 5.0f;
RecentFiles["2"]["Name"] = "test2.txt";
RecentFiles["2"]["Last modified"] = "tuesday";
RecentFiles["2"]["Score"] = 5.0f;
for (auto it = RecentFiles.begin(); it != RecentFiles.end(); ++it) {
bla("JSON: Recent file = " + it.value()["Name"]);
}
std::cout << RecentFiles; }
错误:
prog.cc: In function 'int main()':
prog.cc:18:31: error: invalid conversion from 'const char*' to 'nlohmann::detail::iter_impl<nlohmann::basic_json<> >::difference_type {aka long int}' [-fpermissive]
std::cout << it["Name"];
^
In file included from prog.cc:2:0:
./nlohmann/json.hpp:4418:15: note: initializing argument 1 of 'nlohmann::detail::iter_impl<BasicJsonType>::reference nlohmann::detail::iter_impl<BasicJsonType>::operator[](nlohmann::detail::iter_impl<BasicJsonType>::difference_type) const [with BasicJsonType = nlohmann::basic_json<>; nlohmann::detail::iter_impl<BasicJsonType>::reference = nlohmann::basic_json<>&; nlohmann::detail::iter_impl<BasicJsonType>::difference_type = long int]'
reference operator[](difference_type n) const
^
以上是在沙盒中完成的
https://wandbox.org/permlink/LNck7Gktm14bmPy0
这不是我正在使用的实际代码,我只是想看看我是否可以理解如何使用 JSON 来完成我需要做的各种基本事情。
目前我理解的太少了,我不知道我所做的是否本质上是正确的,只是因为一些愚蠢的事情而中断,或者我是否做的事情根本上是错误的。
nlohmann json 库将自己宣传为“JSON for modern C++”,并渴望表现得“就像一个 STL 容器”。然而,在 C++ 标准库中没有容器既是“类向量”又是“类映射”,并且支持值上的 begin/end 迭代器和 [= 上的 begin/end 迭代器28=]对。所以需要一些新东西。
nlohmann 最初的解决方案是复制 jsoncpp 的方法,它支持 begin/end 迭代器用于 json 数组,并向迭代器添加一个明显不标准的 key()
函数还支持 json 个对象。所以你可以写
for (auto it = RecentFiles.begin(); it != RecentFiles.end(); ++it)
{
std::cout << it.key() << "\n";
std::cout << (*it)["Name"].get<std::string>() << "\n";
std::cout << (*it)["Last modified"].get<std::string>() << "\n";
}
但作为迭代 key/values 的非标准方式,这没有标准库支持基于范围的循环 key/values。
nlohmann 后来添加了 json::items()
函数,该函数支持使用标准迭代器对 json 对象进行迭代,并且确实具有对基于范围的 for 循环的标准库支持,即
int main()
{
json RecentFiles;
RecentFiles["1"]["Name"] = "test1.txt";
RecentFiles["1"]["Last modified"] = "monday";
RecentFiles["1"]["Score"] = 5.0f;
RecentFiles["2"]["Name"] = "test2.txt";
RecentFiles["2"]["Last modified"] = "tuesday";
RecentFiles["2"]["Score"] = 5.0f;
for (const auto& item : RecentFiles.items())
{
std::cout << item.key() << "\n";
for (const auto& val : item.value().items())
{
std::cout << " " << val.key() << ": " << val.value() << "\n";
}
}
std::cout << "\nor\n\n";
for (const auto& item : RecentFiles.items())
{
std::cout << item.key() << "\n";
std::cout << " " << item.value()["Name"].get<std::string>() << "\n";
std::cout << " " << item.value()["Last modified"].get<std::string>() << "\n";
std::cout << " " << item.value()["Score"].get<double>() << "\n";
}
}
输出:
1
Last modified: "monday"
Name: "test1.txt"
Score: 5.0
2
Last modified: "tuesday"
Name: "test2.txt"
Score: 5.0
or
1
test1.txt
monday
5
2
test2.txt
tuesday
5