使用Gson解析JSON数组到Java列表

使用Gson解析JSON数组到Java列表,java,json,list,gson,json-deserialization,Java,Json,List,Gson,Json Deserialization,从给定的JSON生成SimpleTestClass类型的List的最佳方法是什么,其中有一个新的SimpleTestClass对象,用于JSON的recipients数组中的值以及代码集 public class SimpleTestClass{ String code; String recipient; } JSON有效负载: { "code": 123, "recipients": [ "888888", "222

从给定的
JSON
生成
SimpleTestClass
类型的
List
的最佳方法是什么,其中有一个新的
SimpleTestClass
对象,用于
JSON
recipients
数组中的值以及代码集

public class SimpleTestClass{
     String code;
     String recipient; 
}
JSON
有效负载:

{
     "code": 123,
     "recipients": [
        "888888",
        "222222"
     ]
}
类SimpleTestClass{
字符串代码;
列出收件人名单;
公共字符串getCode(){
返回码;
}
公共无效设置码(字符串码){
this.code=代码;
}
公共列表getRecipients(){
返回收件人;
}
公共收件人(列出收件人){
this.recipients=收件人;
}
}
公共类ServerMain{
公共静态void main(字符串[]args){
Gson g=新的Gson();
SimpleTestClass类=g.fromJson(json,SimpleTestClass.class);
}
}

如果
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
}

对但是,如果想要确切的结构:对于每个接收者,使用给定代码创建新的SimpleTestClass对象,该怎么办?您能详细解释一下吗?例如,在收件人数组中的json中,我们有两个值“88888”和“22222”。我想找到生成SimpleTestClass类型的两个对象的最佳方法,一个用于“88888”,另一个用于“22222”,其中设置了代码,在这种情况下是“123”。我只是在寻找做这件事的最佳方式,也许是用Gson做的
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'}