2016-02-04 7 views
5

Próbuję skonsumować usługę, która daje mi podmiot z polem, że jest tablicą.Jackson deserializować pojedynczy element na listę

{ 
    "id": "23233", 
    "items": [ 
    { 
     "name": "item 1" 
    }, 
    { 
     "name": "item 2" 
    } 
    ] 
} 

Ale gdy tablica zawiera pojedynczy przedmiot, zwracany jest sam przedmiot zamiast tablicy jednego elementu.

{ 
    "id": "43567", 
    "items": { 
     "name": "item only" 
    } 
} 

W takim przypadku Jackson nie może dokonać konwersji na mój obiekt Java.

public class ResponseItem { 

    private String id; 
    private List<Item> items; 

    //Getters and setters... 
} 

Czy istnieje proste rozwiązanie tego problemu?

+0

To wydaje się dziwne zachowanie dla tej usługi. Czy masz szansę powiedzieć dostawcy, żeby to naprawił? – Thomas

+0

@ Thomas Niestety nie. To duży dostawca SaaS z setkami użytkowników i jestem tylko jednym z nich. – WinterN

Odpowiedz

-2

Jestem całkiem Gson jest w stanie to zrobić bez czkawki. Mam nadzieję, że ktoś może ci pomóc z Jacksonem, jeśli utkniesz w tym.

(przykład: https://stackoverflow.com/a/18547661/1638595)

EDIT: Heh, przepraszam, chciałem powiedzieć: "mam nadzieję, że ktoś może pomóc ..." zamiast "nie może". Pojawił się niegrzeczny.

1

Do rozwiązania tego problemu można użyć niestandardowego JsonDeserializera.

E.g.

class CustomDeserializer extends JsonDeserializer<List<Item>> { 

    @Override 
    public List<Item> deserialize(JsonParser jsonParser, DeserializationContext context) 
      throws IOException, JsonProcessingException { 

     JsonNode node = jsonParser.readValueAsTree(); 

     List<Item> items = new ArrayList<>(); 
     ObjectMapper mapper = new ObjectMapper(); 

     if (node.size() == 1) { 
      Item item = mapper.readValue(node.toString(), Item.class); 
      items.add(item); 

     } else { 
      for (int i = 0; i < node.size(); i++) { 
       Item item = mapper.readValue(node.get(i).toString(), Item.class); 
       items.add(item); 
      } 
     } 

     return items; 
    } 

} 

trzeba powiedzieć Jackson używać tego do de-serializacji items, jak:

@JsonDeserialize(using = CustomDeserializer.class) 
private List<Item> items; 

Po, że będzie działać. Szczęśliwe kodowanie :)

+0

To jest złe. nie będzie działać z głębokimi strukturami, w których możesz chcieć pojedynczych wartości jako tablic na wielu poziomach. Używanie oddzielnego programu odwzorowującego w celu deserializacji całej gałęzi List w sposób domyślny. Dodatkowy mapper otrzymuje instancję z każdą deserializacją List. –

Powiązane problemy