有没有可能使用Jackson将数据反序列化到具有私有字段和自定义参数构造函数的类中,而不使用注释或修改该类?
我知道在Jackson中可以使用以下组合实现:1)Java 8,2)使用“-parameters”选项进行编译,3)参数名称与JSON匹配。但是在GSON中,默认情况下无需所有这些限制也可以实现。
例如:
Gson似乎跳过了参数构造函数,因此必须使用反射在幕后创建一个无参构造函数。此外,存在一个Kotlin Jackson模块,可以为Kotlin数据类执行此操作,即使没有"-parameters"编译器标志。因此,Java Jackson似乎不存在这样的解决方案。这是Kotlin Jackson中可用的(美观而干净的)解决方案,我认为它也应该通过自定义模块在Java Jackson中变得可用。
我知道在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来说很好,但是Jackson会抛出以下异常:
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中是可能的,因此我希望在Jackson中也有一些方法可以实现,而不需要修改Person类,不需要使用Java 8,也不需要显式自定义反序列化器。有人知道解决方法吗?
- 更新,附加信息
Gson似乎跳过了参数构造函数,因此必须使用反射在幕后创建一个无参构造函数。此外,存在一个Kotlin Jackson模块,可以为Kotlin数据类执行此操作,即使没有"-parameters"编译器标志。因此,Java Jackson似乎不存在这样的解决方案。这是Kotlin Jackson中可用的(美观而干净的)解决方案,我认为它也应该通过自定义模块在Java Jackson中变得可用。
val mapper = ObjectMapper()
.enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES)
.registerModule(KotlinModule())
val person: Person = mapper.readValue(json, Person::class.java)
person
创建一个空构造函数。 - Kalaiselvan