问题:使用jackson,将map转带内部类的实体报错,不知道使用convert这种方法该怎么解决了。除了使用先将map序列化,再反序列化为实体的方法
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.*;
import java.util.HashMap;
import java.util.Map;
public class MapToEntityConverter {
public static void main(String[] args) {
// 创建一个示例Map,其中包含JSON字符串
Map<String, Object> map = new HashMap<>();
map.put("name", "John");
map.put("age", 25);
map.put("address", "{\"street\":\"123 Main St\",\"city\":\"New York\"}");
// 将包含JSON字符串的Map转换为带内部类的实体类
ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.convertValue(map, Person.class);
// 打印转换后的实体类对象
System.out.println(person);
}
}
@Data
class Person {
private String name;
private int age;
@JsonProperty("address")
private Address address;
// 省略构造函数、Getter和Setter方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
static class Address {
private String street;
private String city;
// 省略构造函数、Getter和Setter方法
@Override
public String toString() {
return "Address{" +
"street='" + street + '\'' +
", city='" + city + '\'' +
'}';
}
}
报错信息:
Exception in thread "main" java.lang.IllegalArgumentException: Cannot construct instance of `com.kinlon.Person$Address` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{"street":"123 Main St","city":"New York"}')
at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: com.kinlon.Person["address"])
at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:4393)
at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:4324)
at com.kinlon.MapToEntityConverter.main(MapToEntityConverter.java:20)
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.kinlon.Person$Address` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{"street":"123 Main St","city":"New York"}')
at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: com.kinlon.Person["address"])
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1728)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1353)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromString(StdDeserializer.java:311)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1495)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:196)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:186)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:313)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:176)
at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:4388)