2017-05-04 1 views
-1

Ok, donc ça m'a un peu dérangé. Im obtenir un tableau json hoding objets ressemblant à ceci: [{ "id": "1", "name": "some name", "url": "some url", "active": true }, { "id": "2", "name": "some other name", "url": "some other url", "active": true } ]"désérialise un tableau json dans une liste d'objets java en attente

Maintenant, je veux être en mesure de désérialiser ce tableau dans un objet java contenant une liste des objets dans le tableau. J'ai fait un désérialiseur personnalisé qui ressemble à ceci:

public class ListSerializer extends JsonDeserializer<List<Provider>>{ 

private static final long serialVersionUID = 9114152571639338391L; 

@Override 
public List<Provider> deserialize(JsonParser jsonParser, 
DeserializationContext arg1) throws IOException, JsonProcessingException { 
// TODO Auto-generated method stub 
final ObjectCodec objectCodec = jsonParser.getCodec(); 
final JsonNode listOrObjectNode = objectCodec.readTree(jsonParser); 
final List<Provider> result = new ArrayList<Provider>(); 
for (JsonNode node : listOrObjectNode) { 
    result.add(objectCodec.treeToValue(node, Provider.class)); 
} 
    return result; 
} 



} 

Et la classe tenant la liste ressemble à ceci:

public class ProviderList { 

@JsonDeserialize(using = ListSerializer.class) 
private List<Provider> providerList; 

public List<Provider> getProviderList() { 
    return providerList; 
} 

public void setProviderList(final List<Provider> providerList) { 
    this.providerList = providerList; 
} 

} 

Maintenant, je sais que cela pourrait être une aproche stupide, mais en faisant une longue histoire Bref, c'est juste nécessaire. Je fais évidemment quelque chose de mal, parce que je reçois cette erreur:

Can not deserialize instance of com.wirelesscar.trailser.v1_0.domain.ProviderList out of START_ARRAY token at [Source: [{"id":"1","name":"Posttrack","url":"http:\dev.posttrack.com","active":true},{"id":"2","name":"Trackunit","url":"http:\dev.trackunit.com","active":true}]; line: 1, column: 1]

Donc, ma question. Est-ce possible? et où vais-je me tromper ici.

Merci d'avance!

+0

Pourquoi le vote négatif? @JDC – SwissArmyKnife

+0

Je n'ai pas downvote, je viens d'éditer – JDC

+0

Ahh, ok. Pardon. Je pensais que vous aviez aussi downvoted. merci pour l'édition bien! – SwissArmyKnife

Répondre

1

Vous pouvez désérialiser directement dans une liste à l'aide de l'encapsuleur TypeReference.

@Data 
public class Provider { 
    private Long id; 
    private String name; 
    private String url; 
    private boolean active; 
} 

@Data 
public class ProviderList { 
    List<Provider> providerList; 
} 

public class JsonTest { 

    @Test 
    public void test() { 
     String json = "[{\n" + 
       "  \"id\": \"1\",\n" + 
       "  \"name\": \"some name\",\n" + 
       "  \"url\": \"some url\",\n" + 
       "  \"active\": true\n" + 
       " }, {\n" + 
       "  \"id\": \"2\",\n" + 
       "  \"name\": \"some other name\",\n" + 
       "  \"url\": \"some other url\",\n" + 
       "  \"active\": true\n" + 
       " }\n" + 
       "]"; 

     ObjectMapper mapper = new ObjectMapper(); 
     try { 
      List<Provider> providerList = mapper.readValue(json, new TypeReference<List<Provider>>(){}); 
      for (Provider provider : providerList) { 
       System.out.println(provider); 
      } 

      ProviderList list = new ProviderList(); 
      list.setProviderList(providerList); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
}