当前位置: 首页 > 知识库问答 >
问题:

杰克逊反序列化列表中的地图对象

陈扬
2023-03-14

我在一个文件中有以下 JSON

[
    {"numberEnrolledPerMonthPerWeek":
        {
            {"year":"2011","numberEnrolled":0,"weeks":2},
            {"year":"2011","numberEnrolled":0,"weeks":3},
            {"year":"2011","numberEnrolled":0,"weeks":4},
            {"year":"2011","numberEnrolled":0,"weeks":5},
            {"year":"2011","numberEnrolled":0,"weeks":6},
            {"year":"2011","numberEnrolled":0,"weeks":7},
            {"year":"2011","numberEnrolled":0,"weeks":8},
            {"year":"2011","numberEnrolled":0,"weeks":9}        
        }
        ,"country":"Argentina"
    },
]

当我使用Jackson将其反序列化为Java对象时,我得到以下错误

org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.LinkedHashMap out of START_ARRAY token

我正在使用以下代码

object mapper mapper = new object mapper();

List<EnrolledEnrolment> enrolments = mapper.readValue(new File("src/main/resources/data/jsonQueriesTestData1.txt"), 
        new TypeReference<List<EnrolledEnrolment>>(){});

我已经为初始数组使用了类型引用,但如何将类型引用用于对象EnrolledEnrolment内的hashmap。

private Map<Integer, Enrolled> numberEnrolledPerMonthPerWeek = new HashMap<Integer,Enrolled>();

当它尝试解析第二个数组时抛出错误?有什么想法吗?

谢谢

共有1个答案

程彭祖
2023-03-14

很难说原始帖子中没有实际错误,但我在尝试将JSON自动反序列化为对象时遇到了一个问题,其中JSON包含List中的Map。

我看到了这个错误:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `java.util.LinkedHashMap` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value

我修复了将@JsonDeserialize(转换器= JsonToMap转换器.class)添加到我的POJO中的地图中。

那堂课看起来像这样

public class JsonToMapConverter extends StdConverter<String, Map<String, MyPojo>> {

    @Override
    public Map<String, MyPojo> convert(String value) {
        try {
            return JsonUtil.convertJsonToMap(value, String.class, MyPojo.class);
        }
        catch (Exception e) {
            throw new RuntimeException(String.format("Failed to convert String to POJO [%s]", value));
        }
    }

}

实用方法看起来像

    public static <K,V> Map<K,V> convertJsonToMap(String json, Class<K> key, Class<V> value) throws IOException {
        JavaType type = mapper.getTypeFactory()
            .constructMapLikeType(Map.class, key, value);
        return mapper.readValue(json.getBytes(StandardCharsets.UTF_8), type);
    }
 类似资料:
  • 问题内容: 我有一个JSON字符串,将标记为而不是。因此,例如,如果我有一个没有子对象的对象,我将收到类似以下的字符串: 我想将其反序列化为Parent类,并将子级正确设置为一个空的子级列表。 对于上述JSON字符串,我想要一个对象,其设置为,而设置为。 我会知道如何在整个课堂上使用注释 然后 但是,我想解决一个从字符串正确实例化List的一般问题: 我能得到类似的东西吗? 问题答案: 几个选择;

  • 问题内容: 我正在创建具有嵌套列表的API。杰克逊似乎是创建对象的好工具,但我还不太清楚如何嵌套列表,我想知道它是否可能。 我的对象看起来像这样。 我希望有一种将其映射到看起来像这样的json的方法: 我们希望能够做到这一点,因此我们可以将属性添加到列表中。 问题答案: 您可以为编写自定义解串器。请参见以下示例: 现在,您必须通知Jackson将其用于您的财产。您可以通过以下方式执行此操作:

  • 问题内容: 我有一个杰克逊问题。 有没有一种方法可以反序列化可能具有两种类型的属性,对于某些对象,它看起来像这样 然后对于其他人则显示为空数组,即 任何帮助表示赞赏! 谢谢! 问题答案: Jackson目前没有内置配置来自动处理这种特殊情况,因此必须进行自定义反序列化处理。 以下是这种自定义反序列化的外观示例。 (您可以使用DeserializationConfig.Feature.ACCEPT_

  • 问题内容: 这是我的Java代码,用于反序列化,我正在尝试将json字符串转换为java对象。为此,我使用了以下代码: 和我的product.java类 我收到以下错误。 帮我解决这个问题 问题答案: 似乎您正在尝试从JSON读取一个实际描述数组的对象。Java对象使用花括号映射到JSON对象,但是您的JSON实际上以方括号指定一个数组开始。 您实际拥有的是一个。为了描述泛型类型,由于Java的类

  • 我明白它无法从嵌套JSON反序列化字符串。我解决这个问题的一个方法是通过编写自定义映射器 但是只要pojo中有变化,这就需要修改映射器,添加/删除字段。Mixin工作时没有任何变化,我该如何更新我的Mixin来处理objectId呢?

  • 我想用scala中的jackson反序列化json json_结构: {“type”:“struct”,“fields”:[{“name”:“code_role”,“type”:“string”,“nullable”:true,“metadata”:{“HIVE_type_string”:“string”},{“name”:“libelle_role”,“type”:“string”,“nulla