无法从START_ARRAY标记中反序列化java.util.HashMap的实例

时间:2016-04-09 16:58:52

标签: java json jackson

使用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的匹配解决方案。

任何帮助都将不胜感激。

  

注意:此处提及的此JSONJSON不同Key不同,对于第一个元素,它直接具有值,并且在该值内有key:value对。   我不确定如何访问值内的key:value对。

6 个答案:

答案 0 :(得分:7)

创建一个简单的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将包含List MyClass。现在,您可以根据自己的要求访问此列表。

答案 1 :(得分:6)

您的文件似乎表示具有名称 CreationDate 字段的对象列表。

所以你必须使用List代替HashMap到ObjectMapper,代码如下所示:

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

答案 2 :(得分:4)

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

解决方案是创建List<Map<String, Object>>的TypeReference:

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

答案 3 :(得分:0)

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

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

[{ "key": "value"}]

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

答案 4 :(得分:0)

为什么不呢?

ObjectMapper mapper = new ObjectMapper();

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

答案 5 :(得分:0)

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

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

这样:

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

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