Ho un pezzo di JSON, che assomiglia a questo:Deserialize array nidificato come ArrayList con Jackson
{
"authors": {
"author": [
{
"given-name": "Adrienne H.",
"surname": "Kovacs"
},
{
"given-name": "Philip",
"surname": "Moons"
}
]
}
}
Ho creato una classe per memorizzare le informazioni Autore:
public class Author {
@JsonProperty("given-name")
public String givenName;
public String surname;
}
E due classi wrapper :
public class Authors {
public List<Author> author;
}
public class Response {
public Authors authors;
}
Questo funziona, ma non è necessario disporre di due classi wrapper. Voglio trovare un modo per rimuovere la classe Authors
e avere un elenco come proprietà della classe Entry. È qualcosa del genere è possibile con Jackson?
Aggiornamento
risolto che con deserializzatore personalizzato:
public class AuthorArrayDeserializer extends JsonDeserializer<List<Author>> {
private static final String AUTHOR = "author";
private static final ObjectMapper mapper = new ObjectMapper();
private static final CollectionType collectionType =
TypeFactory
.defaultInstance()
.constructCollectionType(List.class, Author.class);
@Override
public List<Author> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
ObjectNode objectNode = mapper.readTree(jsonParser);
JsonNode nodeAuthors = objectNode.get(AUTHOR);
if (null == nodeAuthors // if no author node could be found
|| !nodeAuthors.isArray() // or author node is not an array
|| !nodeAuthors.elements().hasNext()) // or author node doesn't contain any authors
return null;
return mapper.reader(collectionType).readValue(nodeAuthors);
}
}
e di utilizzarlo in questo modo:
@JsonDeserialize(using = AuthorArrayDeserializer.class)
public void setAuthors(List<Author> authors) {
this.authors = authors;
}
@wassgren Grazie per l'idea.
la risposta ti aiuta –