猿猿猿灬 2023-10-25 22:08 采纳率: 33.3%
浏览 11

使用jackson转换map到实体类报错

问题:使用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)

  • 写回答

2条回答 默认 最新

  • 原来我不知道啊 2023-10-26 09:20
    关注

    报错是objectMapper认为address应该是字符串类型,但实际是Address类型,试试把map中address的值换成一个Map,此Map中包含street 和 city

    评论

报告相同问题?

问题事件

  • 创建了问题 10月25日

悬赏问题

  • ¥15 office打开卡退(新电脑重装office系统后)
  • ¥300 FLUENT 火箭发动机燃烧EDC仿真
  • ¥15 【Hadoop 问题】Hadoop编译所遇问题hadoop-common: make failed with error code 2
  • ¥15 vb6.0+webbrowser无法加载某个网页求解
  • ¥15 RPA财务机器人采购付款流程
  • ¥15 计算机图形多边形及三次样条曲线绘制
  • ¥15 根据protues画的图用keil写程序
  • ¥200 如何使用postGis实现最短领规划?
  • ¥15 pyinstaller打包错误
  • ¥20 cesm的气溶胶排放文件