2013-06-08 8 views
26

Czy istnieje sposób, aby Jackson interpretował pojedynczy obiekt JSON jako tablicę z jednym elementem i na odwrót?Czy Jackson interpretuje pojedynczy obiekt JSON jako tablicę z jednym elementem?

przykład, mieć 2 nieznacznie różne formaty JSON potrzebne zarówno do mapowania samego obiektu Java:

Format A (tablica JSON z jednego elementu):

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

format B (obiekt JSON, tak wiem, że to wygląda na „źle”, ale to co mi podano):

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

docelowy obiekt Java, że ​​oba powyższe należy przekonwertować do:

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

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

Obecnie tylko będzie analizować odpowiednio do danych. Chcę uniknąć bezpośredniego manipulowania z samym JSON. Czy jest jakaś konfiguracja w Jackson, którą mogę zmodyfikować, aby zaakceptować B?

Odpowiedz

46

Spróbuj z DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY - to powinno działać dla Ciebie.

Przykład:

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

Wygląda dokładnie tak, jak tego oczekuję. Wypróbuję to jutro. Dzięki. –

+0

Nie istnieje w Jackson 1.7.9. Jaki jest związek między tym a linkiem, który wysłałeś? –

+1

Powinieneś uaktualnić bibliotekę 'Jackson' do przynajmniej wersji' 2.x.x'. –

7

The Jackson 1.x kompatybilna wersja używa DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY. Tak więc powyższa odpowiedź zmienia się na:

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); 
Powiązane problemy