【问题标题】:Parsing JSON Array to Java List Using Gson使用 Gson 将 JSON 数组解析为 Java 列表
【发布时间】:2019-04-15 11:27:17
【问题描述】:

从给定的JSON 生成SimpleTestClass 类型的List 的最佳方式是什么,其中JSONrecipients 数组中的值有一个新的SimpleTestClass 对象,代码设置为好吧。

public class SimpleTestClass{
     String code;
     String recipient; 
}

JSON有效载荷:

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

【问题讨论】:

    标签: java json list gson json-deserialization


    【解决方案1】:

    如果JSON 结构不适合POJO 模型,您需要编写自定义反序列化器或创建适合JSON 的新POJO 模型,并在反序列化过程后将其转换为所需模型。您可以在下面找到带有自定义解串器的解决方案,它允许您以非常灵活的方式处理给定的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'}
    

    【讨论】:

      【解决方案2】:
      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);
      
          }
      }
      

      【讨论】:

      • 是的。但是,如果想要确切的结构怎么办:为每个接收者使用给定代码的新 SimpleTestClass 对象?
      • 你能解释一下吗?我找不到你。
      • 例如,在收件人数组中的 json 中,我们有两个值“88888”和“22222”。我想找到生成两个 SimpleTestClass 类型对象的最佳方法,一个用于“88888”,一个用于“22222”,设置代码在这种情况下为“123”。我只是寻找这样做的最佳方式,也许是 Gson
      猜你喜欢
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 2011-04-26
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多