【问题标题】:Can not deserialize instance of java.util.HashMap out of START_ARRAY token无法从 START_ARRAY 令牌中反序列化 java.util.HashMap 的实例
【发布时间】:2016-07-30 22:04:35
【问题描述】:

我在使用 jackson-core-2.7.3.jar 解析 JSON 时遇到问题 你可以从这里得到它们http://repo1.maven.org/maven2/com/fasterxml/jackson/core/

我的 JSON 文件是

[
    {
        "Name":  "System Idle Process",
        "CreationDate":  "20160409121836.675345+330"
    },
    {
        "Name":  "System",
        "CreationDate":  "20160409121836.675345+330"
    },
    {
        "Name":  "smss.exe",
        "CreationDate":  "20160409121836.684966+330"
    }
]

Java 代码是我试图解析的代码

byte[] mapData = Files.readAllBytes(Paths.get("process.txt"));
Map<String,String> myMap = new HashMap<String, String>();
ObjectMapper objectMapper=new ObjectMapper();
myMap = objectMapper.readValue(mapData, HashMap.class);
System.out.println("Map is: "+myMap);

但是在执行时我得到了错误

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.HashMap out of START_ARRAY token
 at [Source: [B@34ce8af7; line: 1, column: 1]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:216)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:873)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:869)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromEmpty(StdDeserializer.java:874)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:337)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:26)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3789)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2872)

我尝试过在 stackoverflow 上进行搜索,但找不到这种类型的 JSON 的匹配解决方案。

任何帮助将不胜感激。

注意:这里提到的 JSON 与没有 KeyJSON 不同,对于第一个元素,它直接具有值,并且在该值内它具有 key:valuepair。 我不确定如何访问值内的key:value 对。

【问题讨论】:

标签: java json jackson


【解决方案1】:

您的 JSON 不是地图,而是地图列表。所以替换这个:

myMap = objectMapper.readValue(mapData, HashMap.class);

用这个:

myMap = objectMapper.readValue(mapData, new TypeReference<List<Map<String, String>>>(){});

或者您可以更改 JSON 数据的格式...

【讨论】:

    【解决方案2】:

    为什么不呢?

    ObjectMapper mapper = new ObjectMapper();
    
    Object obj = mapper.readValue(file, new TypeReference<Object>() {});
    

    【讨论】:

      【解决方案3】:

      好吧,您正在尝试将包含 对象数组/列表json 字符串 转换为 对象

      例如:{ "key": "value"} 是您要转换的 json,但实际上您正在做,

      [{ "key": "value"}].

      简单的修复,从字符串中删除第一个和最后一个字符并尝试。希望对你有帮助;)

      【讨论】:

        【解决方案4】:

        引发此异常是因为您试图反序列化 Map 中的 List

        解决方案是创建List&lt;Map&lt;String, Object&gt;&gt;的TypeReference:

        List<Map<String, Object>> myObjects = 
                  mapper.readValue(mapData , new TypeReference<List<Map<String, Object>>>(){});
        

        【讨论】:

        • 您的解决方案正在运行,但是我们如何检查文件是返回 List 还是 Map。由于上述解决方案对于地图将失败。
        【解决方案5】:

        您的文件似乎代表具有 NameCreationDate 字段的对象列表。

        所以你只需要使用List而不是HashMap到ObjectMapper,代码如下:

        List<HashMap> dataAsMap = objectMapper.readValue(mapData, List.class);
        

        【讨论】:

          【解决方案6】:

          创建一个简单的pojo Class First

          class MyClass
          {
          @JsonProperty
          private String Name;
          @JsonProperty
          private String CreationDate;
          }
          

          并使用此代码...

          byte[] mapData = Files.readAllBytes(Paths.get("process.txt"));
          
          ObjectMapper objectMapper=new ObjectMapper();
          //add this line  
          objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);    
          List<MyClass> myObjects = mapper.readValue(mapData , new TypeReference<List<MyClass>>(){});
          

          byte[] mapData = Files.readAllBytes(Paths.get("process.txt"));
          
          ObjectMapper objectMapper=new ObjectMapper();
           //add this line  
          objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);    
          
          List<MyClass> myObjects = mapper.readValue(mapData , mapper.getTypeFactory().constructCollectionType(List.class, MyClass.class));
          

          myObjects 将包含 ListMyClass。现在您可以根据需要访问此列表。

          【讨论】:

          • 请再次检查 JSON 文件 创建类 MyClass 不适用于此 JSON。我需要知道我该怎么写,因为它是一个没有名字的 JSON
          • 我应该调查什么? @AshishPatel
          • JSON 文件是 value->key:value pair 如果您查看它,它没有第一级密钥对。因此,即使我在执行时创建类 MyClass 也会引发错误 Unrecognized field "Name"
          • 是的,我试过了这是线程“main”com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException中的错误异常:无法识别的字段“Name”(类testapps.MyProcess),未标记作为可忽略的(0 个已知属性:])
          • @AshishPatel 将 getter 和 setter 添加到您的 testapps.MyProcess 类或在 NameCreationDate 上方添加 @JsonProperty 字段,如下所示:class MyProcess { @JsonProperty private String Name; @JsonProperty private String CreationDate; }
          猜你喜欢
          • 2020-09-23
          • 1970-01-01
          • 2015-03-10
          • 2019-10-25
          • 2015-12-24
          • 2018-12-03
          • 2020-07-07
          • 2011-12-02
          • 2021-03-16
          相关资源
          最近更新 更多