web-dev-qa-db-de.com

Instanz von Java.util.HashMap kann nicht aus dem START_ARRAY-Token deserialisiert werden

Ich habe Probleme beim Parsen von JSON mit jackson-core-2.7.3.jar Sie können sie hier abrufen. Http://repo1.maven.org/maven2/com/fasterxml/jackson/core/

Meine JSON-Datei ist

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

und der Java-Code ist, durch den ich versuche, dies zu analysieren

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

Aber bei der Ausführung bekomme ich den Fehler

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of Java.util.HashMap out of START_ARRAY token
 at [Source: [[email protected]; 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)

Ich habe versucht, über Stackoverflow zu suchen, konnte aber keine passende Lösung für diese Art von JSON finden.

Jede Hilfe wäre dankbar.

HINWEIS: Diese hier erwähnte JSON unterscheidet sich von JSON ohne Key. Für das erste Element hat es einen direkten Wert und innerhalb dieses Werts key:valuepair. Ich bin nicht sicher, wie ich auf ein key:value-Paar zugreifen kann, das sich innerhalb eines Wertes befindet.

7
Ashish Patel

Erstellen Sie eine einfache pojo-Klasse zuerst

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

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

oder

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 wird die List von MyClass enthalten. Jetzt können Sie auf diese Liste gemäß Ihrer Anforderung zugreifen.

6
Vikrant Kashyap

Es scheint, dass Ihre Datei eine Liste von Objekten mit Name und CreationDate Feldern darstellt.

Sie müssen also nur List anstelle von HashMap für ObjectMapper verwenden. Der Code wird unten erwähnt:

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

Diese Ausnahme wird ausgelöst, weil Sie versuchen, eine List in einer Map zu deserialisieren.

Die Lösung erstellt eine TypeReference von List<Map<String, Object>>:

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

Nun, Sie versuchen, eine Json-Zeichenfolge, die ein Array/eine Liste von Objekten enthält, in ein Objekt zu konvertieren. Beispiel: {"key": "value"} ist der Json, den Sie konvertieren möchten, aber tatsächlich machen Sie [{"key": "value"}].

einfacher Fix: Entfernen Sie das erste und letzte Zeichen aus Ihrer Zeichenfolge und versuchen Sie es. Ich hoffe es hilft;)

0
Guru

Warum nicht?

ObjectMapper mapper = new ObjectMapper();

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