我正在使用nlohmann::json
来解析程序中的json。
根据我要获取同一对象的其他成员的对象成员之一,给定一个json,有一个包含多个对象的数组。
就像下面的json
{
"arr":[
{"a":1, "b":11, "c":111, ...},
{"a":2, "b":22, "c":222, ...},
{"a":3, "b":33, "c":333, ...},
...
]
}
例如,如果a
的值为2
,我想获取相同索引/对象的b,c,...的值。
当前,我正在使用for循环,并在索引j["arr"][i]["a"].get<int> == 2
处使用其余成员。由于数组可能有数百个成员,所以这是胡说八道。
在这种情况下最好的方法是什么?
答案 0 :(得分:1)
这是一个JSON数组,您需要对其进行迭代。因此,您的方法是简单直接的方法。
答案 1 :(得分:1)
让我们调用arr
Thing
的元素的C ++类型,您可以将arr
转换为std::vector<Thing>
。
void to_json(nlohmann::json & j, const Thing & t) {
j = nlohmann::json{{"a", t.a}, {"b", t.b}, {"c", t.c}}; // similarly other members ...
}
void from_json(const nlohmann::json & j, Thing & t) {
j.at("a").get_to(t.a);
j.at("b").get_to(t.b);
j.at("c").get_to(t.c); // similarly other members ...
}
std::vector<Thing> things = j["arr"];
auto it = std::find_if(things.begin(), things.end(), [](const Thing & t){ return t.a ==2; });
// use it->b etc
答案 2 :(得分:0)
x2struct(https://github.com/xyz347/x2struct)可以根据条件将json加载到struct。
#include "x2struct.hpp"
#include <iostream>
using namespace std;
struct Item {
int a;
int b;
int c;
XTOSTRUCT(O(a,b,c));
XTOSTRUCT_CONDITION() { // load only this return true
int a = -1;
if (obj.has("a")) {
obj["a"].convert(a);
}
return a==2;
}
};
struct Test {
Item arr;
XTOSTRUCT(O(arr));
};
int main(int argc, char *argv[]) {
string jstr = "{\"arr\":[{\"a\":1, \"b\":11, \"c\":111},{\"a\":2, \"b\":22, \"c\":222},{\"a\":3, \"b\":33, \"c\":333}]}";
Test t;
x2struct::X::loadjson(jstr, t, false);
cout<<t.arr.b<<','<<t.arr.c<<endl;
}
输出为:
22,222