Я пытаюсь разобрать JSON с помощью этого решения C ++ JSON Сериализация
, но разница в том, что я пытаюсь проанализировать непосредственно C struct, поэтому одной из проблем является присвоение строки.
Ошибка заключается в следующем:
**error: incompatible types in assignment of 'int' to 'char [128]'
obj->*(property.member) = a;**
Но если я переключусь с использования простого массива char на использование std :: string внутри Cat структура, все в порядке. Любые идеи о том, как я могу сделать эту работу, используя простую строку стиля C? я не хочу изменять структуру Cat.
#define STR_LEN 128
struct Cat {
char name [STR_LEN];
int age;
};
template<typename T>
void fromJson(const json& data, T &object) {
constexpr auto nbProperties = std::tuple_size<decltype(T::properties)>::value;
for_sequence(std::make_index_sequence<nbProperties>{}, [&](auto i){
constexpr auto property = std::get<i>(T::properties);
if (data.contains(property.name))
{
auto *obj = object.c; // the Cat inner object
if(data[property.name].is_string())
{
const char *str = data[property.name].dump().c_str();
std::cout << " is string > " << str << std::endl;
// strncpy(&(obj->*(property.member)), str, STR_LEN);
}
else
{
std::cout << data[property.name] << std::endl;
int a = data[property.name];
obj->*(property.member) = a;
// obj->*(property.member) = data[property.name];
}
}
});
}
class CatParser {
public:
Cat *c;
CatParser() {}
CatParser(Cat *cat): c(cat) { }
constexpr static auto properties = std::make_tuple(
property(&Cat::name, "name"), property(&Cat::age, "age"));
};
int main() {
json j;
j["name"] = "Kitty";
j["age"] = 3;
Cat c;
CatParser cp(&c);
fromJson<CatParser>(j, cp);
return 0;
}