c ++,JSON,获取数组中的对象成员

时间:2018-11-16 16:36:01

标签: c++ json nlohmann-json

我正在使用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处使用其余成员。由于数组可能有数百个成员,所以这是胡说八道。

在这种情况下最好的方法是什么?

3 个答案:

答案 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