闽公网安备 35020302035485号
public class ImmutableUser {
private final String name;
private final int age;
private final String identityCard;
public ImmutableUser(String name, int age, String identityCard) {
this.name = name;
this.age = age;
this.identityCard = identityCard;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getIdentityCard() {
return identityCard;
}
}
或许你会写下这样的代码,结果发现一执行就报错了:no Creators, like default constructor, exist.@Test
public void readImmutableUser() throws JsonProcessingException {
String userJson = "{"name":"Tom","age":23,"identityCard":"61012420000101012x"}";
ObjectMapper mapper = new ObjectMapper();
ImmutableUser user = mapper.readValue(userJson, ImmutableUser.class);
System.out.println(MAPPER.writeValueAsString(user));
}
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.learn.more.entiry.ImmutableUser (no Creators, like default constructor, exist): ......
一 使用Jackson注解import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
// 堆代码 duidaima.com
// 与ImmutableUser的区别:使用@JsonProperty、@JsonCreator修饰全参构造器
public class ImmutableUser2 {
private final String name;
private final int age;
private final String identityCard;
@JsonCreator
public ImmutableUser2(@JsonProperty("name") String name,
@JsonProperty("age") int age, @JsonProperty("identityCard") String identityCard) {
this.name = name;
this.age = age;
this.identityCard = identityCard;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getIdentityCard() {
return identityCard;
}
}
还是上面的测试代码,这次发现执行成功了。需注意,@JsonProperty的value必须填写,且最好与Json串中字段名一致。否则将导致下面的异常。com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Invalid type definition for type com.learn.more.entiry.ImmutableUser2: ..., annotations: ... has no property name (and is not Injectable): can not use as property-based Creator二 使用jackson-module-parameter-names
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
<version>${jackson.version}</version>
</dependency>
向ObjectMapper注册ParameterNamesModule,就可以执行成功了。@Test
public void readImmutableUser() throws JsonProcessingException {
String userJson = "{"name":"Tom","age":23,"identityCard":"61012420000101012x"}";
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new ParameterNamesModule());
ImmutableUser user = mapper.readValue(userJson, ImmutableUser.class);
System.out.println(MAPPER.writeValueAsString(user));
}
三 使用Mixins机制import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
public class ImmutableUserMixin {
@JsonCreator
public ImmutableUserMixin(@JsonProperty("name") String name,
@JsonProperty("age") int age, @JsonProperty("identityCard") String identityCard) {
}
}
再创建一个自定义的JacksonMixinModule类,将ImmutableUser与ImmutableUserMixin对应关系,设置到SetupContext。import com.fasterxml.jackson.databind.module.SimpleModule;
import com.learn.more.entiry.ImmutableUser;
import com.learn.more.entiry.ImmutableUserMixin;
public class JacksonMixinModule extends SimpleModule {
public JacksonMixinModule() {
super(JacksonMixinModule.class.getName());
}
// 注册所有使用Mixin机制的类
@Override
public void setupModule(SetupContext context) {
context.setMixInAnnotations(ImmutableUser.class, ImmutableUserMixin.class);
// ......
}
}
向ObjectMapper注册JacksonMixinModule类。那么,在反序列化ImmutableUser时,将依据ImmutableUserMixin的构造器声明来绑定属性值。@Test
public void readImmutableUserMixin() throws JsonProcessingException {
String userJson = "{"name":"Tom","age":23,"identityCard":"61012420000101012x"}";
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JacksonMixinModule());
ImmutableUser user = mapper.readValue(userJson, ImmutableUser.class);
System.out.println(MAPPER.writeValueAsString(user));
}
可以成功反序列化。