Разбор массива JSON в список Java с помощью Gson - PullRequest
0 голосов
/ 15 апреля 2019

Каков наилучший способ из данного JSON для генерации List типа SimpleTestClass, где есть новый объект SimpleTestClass для значений в массиве recipients в JSON с кодом, заданным какЧто ж.

public class SimpleTestClass{
     String code;
     String recipient; 
}

JSON полезная нагрузка:

{
     "code": 123,
     "recipients": [
        "888888",
        "222222"
     ]
}

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Если структура 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'}
0 голосов
/ 15 апреля 2019
class SimpleTestClass {
    String code;
    List<String> recipients;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public List<String> getRecipients() {
        return recipients;
    }

    public void setRecipients(List<String> recipients) {
        this.recipients = recipients;
    }

}

public class ServerMain {
    public static void main(String[] args) {

        Gson g = new Gson();
        SimpleTestClass class = g.fromJson(json, SimpleTestClass.class);

    }
}
...