簡體   English   中英

使用Gson優雅地處理嵌套的json對象?

[英]Using Gson to elegantly handle nested json objects?

我正在使用Gson解析Android上服務器的響應。 每個響應都有一些無用的(對我而言)數據,這使我的Gson模型變得復雜。 這是json返回的一般層次結構:

response: {
  date: 1406253006807,
  otherUselessData1: "This is some useless data",
  otherUselessData2: "This is some useless data",

  usefulJsonObject: {   <---- This is really the object that I care about
  }

}

高於或等於usefulJsonObject所有東西,我真的可以沒有。 為每個請求返回無用的數據,實際的響應作為usefulJsonObject嵌入到下面。 這不是一個大問題,但它真的讓我的gson模型對象變得混亂。

例如:假設我有3個請求: A,B和C. 對於每個響應,我似乎需要至少制作3個自定義類。

public class ResponseA {

  @SerializedName("response") ResponseObjectA responseObject;

  public static class ResponseObjectA {
    @SerializedName("usefulJsonObject") UsefulObjectA usefulObject; 
  }

  public static class UsefulObjectA {
  }

}

我已經嘗試了一些解決方案,但我沒有找到任何優雅的東西,不會給我的過程增加額外的一步。 我正在使用改造來做我的http請求,它真的很好,它只是將完全解析的gson對象返回給我。 我想到了其他解決方案,比如讓有用的對象只是一個JsonElement,然后在第一次回來之后進行第二次gson調用。 再次,不理想。

我只是想知道我是否遺漏了什么。 當然,我不是唯一一個遇到類似事情的人,所以我想我會問其他人如何處理這樣的事情。

它是初始化Instance值,而不是NULL值。 檢查我的例子。

Address.java

public class Address {
    public Address(){
    }
}

Person.java

public class Person {
    private String name;
    private String nrc;
    private Address address;

    public Person(String name, String nrc, Address address) {
        this.name = name;
        this.nrc = nrc;
        this.address = address;
    }
}

以下Json字符串等於

Person person = new Person("Zaw Than Oo", "11111", null);

{
  "name": "Zaw Than Oo",
  "nrc": "11111"
}

以下Json字符串等於

Person person = new Person("Zaw Than Oo", "11111", new Address());

{
  "name": "Zaw Than Oo",
  "nrc": "11111",
  "address": {} <-- here use less object for you. 
}

即使您沒有創建新Instance ,其他lib/api (您使用過的)也可能通過Reflection創建該實例。

點到點

{
    ...
    "xxx": {} --> new instance without data/value
    ...
}
{
    ...
              --> null value
    ...
}

我從來沒有找到一個優雅的方式處理只是Gson。 我嘗試了Generics的幾個選項,所有這些選項都不起作用或留下了一些不足之處。

由於我正在使用Retrofit,我決定覆蓋GsonConverter,只是從我的所有請求中過濾掉不必要的信息。 它最終沒有那么靈活,因為我無法使用相同的Retrofit網絡接口來調用其他服務器,但我並沒有真正這樣做,而且它還有兩輪json解析調用的缺點(MEH)。 你可以更有效地做到這一點,但現在這對我有用。

public class CustomGsonConverter extends GsonConverter {

  private Gson mGson;

  public CustomGsonConverter(Gson gson) {
    super(gson);
    this.mGson = gson;
  }

  public CustomGsonConverter(Gson gson, String encoding) {
    super(gson, encoding);
    this.mGson = gson;
  }

  @Override public Object fromBody(TypedInput body, Type type) throws ConversionException {
    try {
      CustomResponse customResponse = mGson.fromJson(new InputStreamReader(body.in()), CustomResponse.class);
      return mGson.fromJson(customResponse.responseObject.data, type);
    } catch (IOException e) {
      throw new ConversionException(e);
    }
  }

  public static class CustomResponse {

    @SerializedName("rsp") ResponseObject responseObject;

    public static class ResponseObject {

//    @SerializedName("date") long date;

      @SerializedName("data") JsonElement data;

    }

  }

}

也許有一種更好的方式,我只是沒有意識到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM