Existe-t-il un moyen pour que Jackson interprète un seul objet JSON comme un tableau avec un élément et vice versa?
Exemple, j'ai 2 formats légèrement différents de JSON, j'ai besoin des deux pour mapper sur le même Java object:
Format A (tableau JSON avec un élément):
points : [ {
date : 2013-05-11
value : 123
}]
Format B (objet JSON, oui je sais que ça a l'air "faux" mais c'est ce qu'on me donne):
points : {
date : 2013-05-11
value : 123
}
Cible Java objet que les deux éléments ci-dessus doivent convertir en:
//Data.Java
public List<Point> points;
//other members omitted
//Point.Java
class Point {
public String date;
public int value;
}
Actuellement, seul A analysera correctement les données. Je veux éviter d'altérer directement le JSON lui-même. Y a-t-il une configuration à Jackson que je peux altérer pour la faire accepter B ?
Essayez avec DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY
- cela devrait fonctionner pour vous.
Exemple:
final String json = "{\"date\" : \"2013-05-11\",\"value\" : 123}";
final ObjectMapper mapper = new ObjectMapper()
.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
final List<Point> points = mapper.readValue(json,
new TypeReference<List<Point>>() {
});
System.out.println(points);
La version compatible avec Jackson 1.x utilise DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY
. Ainsi, la réponse ci-dessus devient:
final String json = "{\"date\" : \"2013-05-11\",\"value\" : 123}";
final ObjectMapper mapper = new ObjectMapper()
.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
final List<Point> points = mapper.readValue(json,
new TypeReference<List<Point>>() {
});
System.out.println(points);
Peut résoudre le problème ci-dessus par ce code est donné ci-dessous, cela fonctionne
final ObjectMapper objectMapper = new
ObjectMapper().enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
try {
String jsonInString = objectMapper.writeValueAsString(products.get(j));
InventoryParser inventoryParser = objectMapper.readValue(jsonInString,
InventoryParser.class);
System.out.println(inventoryParser.getId());
}
catch (IOException e)
{
e.printStackTrace();
}
"InventoryParser" est une classe POJO. "products.get (j)" est une chaîne JSON.