[英]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.