Nlohmann JSON получить с типом удержания - PullRequest
0 голосов
/ 05 сентября 2018

С nlohmann::json объект может быть проанализирован с помощью пары различных выражений:

  1. type x = json;
  2. type x; x = json.get<type>();

Однако type x; x = json; не работает, поскольку для этого потребуется добавить новый оператор присваивания для type.

Мне нужно использовать выражение (2) чаще, чем выражение (1). Это может раздражать, особенно если type что-то сложное. В нескольких случаях я определил

template <typename U>
void convert(const json& j, U& x) { x = j.get<U>(); }

Но было бы неплохо, если бы у get была перегрузка, принимающая ссылку в качестве аргумента, чтобы было возможно следующее.

type x;
json.get(x);

Уже есть функция, которая делает это, просто с другим именем? Я не смог найти его в документации.

Редактировать : Я отправил выпуск на GitHub.

Редактировать 2 : альтернатива функции get, T& get_to(T&), будет включена в выпуск 3.3.0.

1 Ответ

0 голосов
/ 05 сентября 2018

Однако type x; x = json; не работает

Это действительно работает. У basic_json типа есть оператор преобразования шаблонов , который просто вызывает для вас get<T>(). Следующий код прекрасно компилируется :

#include <nlohmann/json.hpp>

using nlohmann::json;

namespace ns {
    struct MyType {
        int i;
    };

    void to_json(json& j, MyType m) {
        j = json{{"i", m.i}};
    }

    void from_json(json const& j, MyType& m) {
        m.i = j.at("i");
    }
}

int main() {
    json j{{"i", 42}};
    ns::MyType type;
    type = j;
}
...