簡體   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