c ++, JSON, получить члены объекта в массиве - PullRequest
0 голосов
/ 16 ноября 2018

Я использую 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 голосов
/ 19 ноября 2018

Это массив JSON, вам нужно перебрать его. Таким образом, ваш подход является простым и прямым.

0 голосов
/ 19 ноября 2018

Давайте назовем тип C ++ элементов arr Thing, вы можете преобразовать 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
0 голосов
/ 19 ноября 2018

x2struct (https://github.com/xyz347/x2struct) может загрузить json для структурирования с условием.

#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
...