web-dev-qa-db-fra.com

Impossible de désérialiser l'instance de Java.util.HashMap à l'aide du jeton START_ARRAY

Je suis confronté à un problème lors de l'analyse de JSON à l'aide de jackson-core-2.7.3.jarVous pouvez les obtenir à partir d'ici http://repo1.maven.org/maven2/com/fasterxml/jackson/core/

Mon fichier JSON est

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

et le code Java est par lequel j'essaie d'analyser c'est

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);

Mais lors de l'exécution, j'obtiens l'erreur

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)

J'ai essayé de chercher sur stackoverflow mais je n'ai pas trouvé de solution compatible avec ce type de JSON.

Toute aide serait appréciée.

NOTE: Cette JSON mentionnée ici est différente d'une JSON sans Key, pour le premier élément, elle a une valeur directe et à l'intérieur de cette valeur, elle a key:valuepair. Je ne suis pas sûr de savoir comment accéder à la paire key:value qui se trouve dans une valeur.

7
Ashish Patel

Créez une classe pojo simple d'abord

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

et utiliser ce code ...

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>>(){});

ou

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 contient la List de MyClass. Maintenant, vous pouvez accéder à cette liste selon vos besoins.

6
Vikrant Kashyap

Il semble que votre fichier représente une liste d'objets avec les champs Name et CreationDate .

Donc vous devez simplement utiliser List au lieu de HashMap to ObjectMapper, le code est mentionné ci-dessous:

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

Cette exception est déclenchée parce que vous essayez de désérialiser une List dans une Map.

La solution est de créer un TypeReference of List<Map<String, Object>>:

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

Eh bien, vous essayez de convertir une chaîne JSON contenant un tableau/une liste d’objets en objet. Ex: {"key": "value"} est le JSON que vous voulez convertir, mais vous le faites, [{"key": "value"}]

solution simple, supprimez le premier et le dernier caractère de votre chaîne et essayez. J'espère que ça aide;)

0
Guru