Я знаю, что это возможно в Jackson при использовании эта комбинация: 1) Java 8, 2) компиляция с опцией «-parameters» и 3) имена параметров соответствуют JSON. Но это также возможно в GSON по умолчанию без всех этих ограничений.
Например:
public class Person {
private final String firstName;
private final String lastName;
private final int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public static void main(String[] args) throws IOException {
String json = "{firstName: \"Foo\", lastName: \"Bar\", age: 30}";
System.out.println("GSON: " + deserializeGson(json)); // works fine
System.out.println("Jackson: " + deserializeJackson(json)); // error
}
public static Person deserializeJackson(String json) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES);
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
return mapper.readValue(json, Person.class);
}
public static Person deserializeGson(String json) {
Gson gson = new GsonBuilder().create();
return gson.fromJson(json, Person.class);
}
}
Это отлично работает для GSON, но Джексон выдает ошибку:
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `jacksonParametersTest.Person` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)"{firstName: "Foo", lastName: "Bar", age: 30}"; line: 1, column: 2]
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
Это возможно в GSON, поэтому я ожидаю, что в Джексоне должен быть какой-то способ без изменения класса Person, без Java 8 и без явного пользовательского десериализатора. Кто-нибудь знает решение?
- Обновление, дополнительная информация
Кроме того, существует модуль Kotlin Jackson, который способен сделать это для классов данных Kotlin даже без «-параметров» флаг компилятора.
Поэтому странно, что такого решения, похоже, не существует для Java Jackson.
Это (красивое и чистое) решение, доступное в Kotlin Jackson ( который IMO также должен стать доступным в Java Jackson через специальный модуль):
val mapper = ObjectMapper()
.enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES)
.registerModule(KotlinModule())
val person: Person = mapper.readValue(json, Person::class.java)
Подробнее здесь: https://stackoverflow.com/questions/475 ... hout-annot
Мобильная версия