web-dev-qa-db-fra.com

Faire interpréter Jackson un seul objet JSON comme un tableau avec un élément

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 ?

39
XiaoChuan Yu

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);
64
Michał Ziober

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

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.

0
user7331939