繁体   English   中英

使用GSON处理JSON API响应的最佳方法是什么?

[英]What's the best way to handle JSON API responses using GSON?

我正在研究一个使用JSON与API进行通信的项目。 这是我第一次尝试JSON,并且已经离开Java几年/几年了,所以请多多包涵。

这是有关数据外观的一个想法:

字串1:

[{
  "apicall1": 
     [{
      "thisField":"thisFieldData",
      "thatField":"thatFieldData",
      "anotherField":"anotherFieldData"
     }]
}]

字串2:

[{
  "apicall2":
     [{
      "thatField":"thatFieldData",
      "someFieldsAreTheSame":"someFieldsAreTheSameData",
      "otherFieldsAreNotTheSame":"otherFieldsAreNotTheSame"
     }]
}]

从我的数据示例中可以看到,API返回一个JSON字符串,其中包含使用的api。 里面的数组包含数据。 API有许多共同的数据字段,但除此之外没有任何关系。

编辑:有许多这些API的类型将需要处理。

我正在尝试做的是创建一个响应类,该类接受所有JSON字符串并返回一个包含适当数据的对象。

例如:

Gson gson = new Gson(); //Custom TypeAdapter goes here if needed.
Response apicall2 = gson.fromJson(apicall2String, Response.class);

System.out.println(apicall2.thatField);                //Prints thatFieldData 
System.out.println(apicall2.someFieldsAreTheSame);     //Prints someFieldsAreTheSameData
System.out.println(apicall2.otherFieldsAreNotTheSame); //Prints otherFieldsAreNotTheSameData

这是我迷路的地方。 这是我到目前为止所拥有的。 我想我需要在这里使用TypeAdapter,但是还无法弄清楚如何将其应用于我的案例。

 public class Response {  //Change to TypeAdapter possibly?
 }
 public class apicall1 {
      String thisField;
      String thatField;
      String anotherField;
 }
 public class apicall2 {
      String thatField;
      String someFieldsAreTheSame;
      String otherFieldsAreNotTheSame;
 }

您可以使用Gson的TypeToken类将json反序列化为对象。 下面是一个示例:

JSON:

[{  "apicall1": 
     [{
      "thisField":"thisFieldData",
      "thatField":"thatFieldData",
      "anotherField":"anotherFieldData"
     }]
}]

模型:

class Response{

    private List<Result> apicall1;

    class Result{
        private String thisField;
        private String thatField;
        private String anotherField;
        public String getThisField() {
            return thisField;
        }
        public void setThisField(String thisField) {
            this.thisField = thisField;
        }
        public String getThatField() {
            return thatField;
        }
        public void setThatField(String thatField) {
            this.thatField = thatField;
        }
        public String getAnotherField() {
            return anotherField;
        }
        public void setAnotherField(String anotherField) {
            this.anotherField = anotherField;
        }
    }

    public List<Result> getApicall1() {
        return apicall1;
    }

    public void setApicall1(List<Result> apicall1) {
        this.apicall1 = apicall1;
    }
}

转换器:

public static void main(String[] args) {
    String response = "[{  \"apicall1\":      [{      \"thisField\":\"thisFieldData\",      \"thatField\":\"thatFieldData\",      \"anotherField\":\"anotherFieldData\"     }]}]";
    Gson gson = new Gson();
    List<Response> responses = gson.fromJson(response, new TypeToken<List<Response>>(){}.getType());
    System.out.println(responses.get(0).getApicall1().get(0).getThisField());
}

我不知道您是否要将两个适配器都放在一个类中。 可能不是最佳的OOP设计。

要实现它,您需要执行以下操作:

public class DoublyTypeAdapter implements JsonDeserializer<ApiCallTypeParent>
{
    Gson gson = new Gson();

    @Override
    public ApiCallTypeParent deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext)
            throws JsonParseException {
        JsonObject json = jsonElement.getAsJsonObject();

        ApiCallTypeParent desrializeIntoMe;
        // Detect which type to implement
        if(apiTypeOne(type) {
              desrializeIntoMe = new TypeOne();
        } else {
              desrializeIntoMe = new TypeTwo();
        }

        for (Map.Entry<String, JsonElement> entry : json.entrySet())
        {
            switch(entry.getKey()){
            case "thisField":
                desrializeIntoMe.setThisField(entry.getValue().getAsString());
                break;
            ......    
            default: // We don't care
                break;
            }
        }

        return desrializeIntoMe ;
      }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM