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'uneJSON
sansKey
, pour le premier élément, elle a une valeur directe et à l'intérieur de cette valeur, elle akey:value
pair. Je ne suis pas sûr de savoir comment accéder à la pairekey:value
qui se trouve dans une valeur.
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.
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);
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>>>(){});
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;)