Я пытался преобразовать свой класс в json в visual studio 2017, но есть ошибки компоновщика C2440. "

Severity    Code    Description Project File    Line    Suppression State
Error   C2440   'initializing': cannot convert from 'ns::person' to 'nlohmann::basic_json<std::map,std::vector,std::string,bool,int64_t,uint64_t,double,std::allocator,nlohmann::adl_serializer>'   jason reader writer c:\users\lengdon\source\repos\jason reader writer\jason reader writer\objecttojason.h   15  

Мой код: Класс 1:

#include<iostream>
#include<string>
#include"nlohmann/json.hpp"
#include"nlohmann/adl_serializer.hpp"
using namespace std;
using json = nlohmann::json;
namespace ns {
    // a simple struct to model a person
    class person {
    public:
        string name;
        string address;
        int age;
        void to_json(json& j, const person& p) {
            j = json{ {"name", p.name}, {"address", p.address}, {"age", p.age} };
        }
        void from_json(const json& j, person& p) {
            j.at("name").get_to(p.name);
            j.at("address").get_to(p.address);
            j.at("age").get_to(p.age);
        }
    };    
}

Класс 2:

#include"Student.h"
#include"nlohmann/json.hpp"
#include"nlohmann/adl_serializer.hpp"
using json = nlohmann::json;
using namespace std;
class ObjectToJason
{
public:
    json convert()
    {
        ns::person p{ "Ned Flanders", "744 Evergreen Terrace", 60 };
        json j=p;

    }
};

В моем коде для класса 2 json j = содержит ошибки " нет подходящих пользовательских преобразований из nson :: person в json, существует ". Я новичок в C ++ и JSON, поэтому, пожалуйста, попробуйте объяснить на простом английском языке. заранее спасибо

0
Raaj 26 Фев 2020 в 07:45

2 ответа

Лучший ответ

Я хотел бы процитировать из документации

https://github.com/nlohmann/json#arbitrary-types-conversions

Эти методы ДОЛЖНЫ быть в пространстве имен вашего типа (которое может быть глобальным пространством имен), иначе библиотека не сможет найти их (в этом примере они находятся в пространстве имен ns, где определен person).

Это означает, что две функции

void to_json(json& j, const person& p)
void from_json(const json& j, person& p)

Должен находиться внутри того же пространства имен, в котором существует пользовательский объект. Который в вашем случае классный человек.

Итак, ваш код для класса 1 будет:

#include<iostream>
#include<string>
#include"nlohmann/json.hpp"
#include"nlohmann/adl_serializer.hpp"
using namespace std;
using json = nlohmann::json;
namespace ns {
    void to_json(json& j, const person& p) {
        j = json{ {"name", p.name}, {"address", p.address}, {"age", p.age} };
    }
    void from_json(const json& j, person& p) {
        j.at("name").get_to(p.name);
        j.at("address").get_to(p.address);
        j.at("age").get_to(p.age);
    }

    // a simple struct to model a person
    class person {
    public:
        string name;
        string address;
        int age;

    };    
}

И ваш код для класса 2 будет:

#include"Student.h"
#include"nlohmann/json.hpp"
#include"nlohmann/adl_serializer.hpp"
using json = nlohmann::json;
using namespace std;
namespace ns {
    class ObjectToJason
    {
        public:
        json convert()
        {
            ns::person p{ "Ned Flanders", "744 Evergreen Terrace", 60 };
            json j=p;
        }
    };
}

Надеюсь, это поможет.

0
ritesh sangani 28 Фев 2020 в 03:57

Проверьте требования здесь https://github.com/nlohmann/json#arbitrary-types- преобразования. Переместите to_json и from_json из класса.

1
vinod sahu 26 Фев 2020 в 05:24