Biorąc pod uwagę następujące POJOs ..Jak serializować zawartość listy do płaskiego obiektu JSON z Jacksonem?
public class City {
private String title;
private List<Person> people;
}
...
public class Person {
private String name;
private int age;
}
Chciałbym niech Jackson instancje serializacji z klas następującemu przykład JSON:
{
"title" : "New York",
"personName_1" : "Jane Doe",
"personAge_1" : 42,
"personName_2" : "John Doe",
"personAge_2" : 23
}
Format JSON jest zdefiniowany przez zewnętrzny interfejs API, którego nie można zmienić.
I już, że mogę opisywać pole listy z niestandardowych serializatora takich jak:
@JsonSerialize(using = PeopleSerializer.class)
private List<Person> people;
... i tutaj jest podstawowym realizacja Próbowałem:
public class PeopleSerializer extends JsonSerializer<List<Person>> {
private static final int START_INDEX = 1;
@Override
public void serialize(List<Person> people,
JsonGenerator generator,
SerializerProvider provider) throws IOException {
for (int i = 0; i < people.size(); ++i) {
Person person = people.get(i);
int index = i + START_INDEX;
serialize(person, index, generator);
}
}
private void serialize(Person person, int index, JsonGenerator generator) throws IOException {
generator.writeStringField(getIndexedFieldName("personName", index),
person.getName());
generator.writeNumberField(getIndexedFieldName("personAge", index),
person.getAge());
}
private String getIndexedFieldName(String fieldName, int index) {
return fieldName + "_" + index;
}
}
to jednak nie powiodło się z:
JsonGenerationException: Can not write a field name, expecting a value
Sprawdziłem również przy użyciu interfejsu Jacksona Converter, ale t nie nadaje się do rozpakowania zagnieżdżonych obiektów list.
Jestem też świadomy @JsonUnwrapped
ale nie jest przeznaczony do stosowania z list.
Notki
- Serialize List content in a flat structure in jackson json (Java)
- Jackson: How to add custom property to the JSON without modifying the POJO
- How to serialize only the ID of a child with Jackson
Chyba trzeba napisać 'JsonSerializer' dla klasy' City', to dlatego, że serializer dla 'City' pisze nazwa pola 'ludzie' następnie oczekuje, że twój niestandardowy' JsonSerializer' zapisze wartość. –
@ug_ Próbowałem tego i opisałem klasę 'City' za pomocą' @JsonSerialize (using = CitySerializer.class). W ramach serializatora niestandardowego dokonałem tylko serializacji pola 'ludzie', podobnie jak w powyższym' PeopleSerializer'. Serializacja kończy się niepowodzeniem z tym samym komunikatem o błędzie. – JJD
@JJD - W przypadku braku szansy istnieje prostsze podejście, jaki jest główny problem, który próbujesz rozwiązać? Nie mogę sobie wyobrazić przypadku, w którym docelowa struktura JSON ułatwia analizowanie ... – AjahnCharles