Если структура JSON
не соответствует модели POJO
, вам необходимо написать собственный десериализатор или создать новую модель POJO
, которая соответствует JSON
, и после процесса десериализации преобразовать ее в требуемую модель.Ниже вы можете найти решение с настраиваемым десериализатором, которое позволяет очень гибко обрабатывать данные JSON
:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.annotations.JsonAdapter;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class GsonApp {
public static void main(String[] args) {
String json = "{\"code\": 123,\"recipients\": [\"888888\",\"222222\"]}";
Gson gson = new GsonBuilder().create();
List<Recipient> recipients = gson.fromJson(json, Recipients.class).getRecipients();
recipients.forEach(System.out::println);
}
}
class RecipientsJsonDeserializer implements JsonDeserializer<Recipients> {
@Override
public Recipients deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
List<Recipient> recipients = new ArrayList<>();
JsonObject root = json.getAsJsonObject();
String code = root.get("code").getAsString();
JsonArray recipientsArray = root.getAsJsonArray("recipients");
recipientsArray.forEach(item -> {
recipients.add(new Recipient(code, item.getAsString()));
});
return new Recipients(recipients);
}
}
@JsonAdapter(RecipientsJsonDeserializer.class)
class Recipients {
private final List<Recipient> recipients;
public Recipients(List<Recipient> recipients) {
this.recipients = recipients;
}
// getters, toString
}
class Recipient {
private final String code;
private final String recipient;
public Recipient(String code, String recipient) {
this.code = code;
this.recipient = recipient;
}
// getters, toString
}
Надпечатки кода выше:
Recipient{code='123', recipient='888888'}
Recipient{code='123', recipient='222222'}