XiaoChuan Yu
XiaoChuan Yu

Reputation: 4011

Make Jackson interpret single JSON object as array with one element

Is there a way to make Jackson interpret single JSON object as an array with one element and vice versa?

Example, I have 2 slightly different formats of JSON, I need both to map to same Java object:

Format A (JSON array with one element):

points : [ {
    date : 2013-05-11
    value : 123
}]

Format B (JSON object, yes I know it looks "wrong" but it's what I'm given):

points : {
    date : 2013-05-11
    value : 123
}

Target Java object that both of the above should convert to:

//Data.java 
public List<Point> points;
//other members omitted

//Point.java
class Point {
    public String date;
    public int value;
}

Currently, only A will parse properly to Data. I want avoid directly tampering with the JSON itself. Is there some configuration in Jackson I can tamper with in order to make it accept B ?

Upvotes: 50

Views: 46821

Answers (3)

Michał Ziober
Michał Ziober

Reputation: 38710

Try with DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY - it should work for you.

Example:

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

Upvotes: 95

S Mugunthan kumar
S Mugunthan kumar

Reputation: 177

Can solve the above problem by this code is given below, this works

 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" is a POJO Class. "products.get(j)" is JSON String.

Upvotes: 0

phillipuniverse
phillipuniverse

Reputation: 2045

The Jackson 1.x-compatible version uses DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY. So the above answer changes to:

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

Upvotes: 9

Related Questions