[英]Gson parsing into Object that contains a JsonArray
請參閱最后的解決方案。
原始問題
我的代碼中有以下對象,試圖與Gson反序列化。
public class Foo {
public Map<String, JSONArray> bar = new HashMap<>();
public ... other stuff
}
我也嘗試過:
public class Foo {
public Map<String, String> bar = new HashMap<>();
public ... other stuff
}
這里的原因是因為Map
將被饋送到可以是任何數據類型的子模塊中。 內部每個模塊都知道如何解析自己的數據。
在JsonArray
版本上,我收到此錯誤:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:
Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 3 column 18 path $.trigger.
在String
版本中,我得到此錯誤:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:
Expected a string but was BEGIN_ARRAY at line 3 column 18 path $.trigger.
我的問題是:
是否可以在不需要自定義反序列化器的情況下進行解析? 怎么樣?
編輯:下面是相關的代碼位:
// Gson is singleton provided by Dagger2
Gson gson = new GsonBuilder().create();
// retrofit is also singleton provided by dagger
Retrofit restAdapter = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(buildOkHttpClient(context))
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
return restAdapter.create(ApiService.class);
// then the Retrofit API
@GET("our path")
Observable<Foo> getFoo(a couple of values);
我還嘗試過使用直接調用Gson的MockTransport,如下所示:
Observable
.just(fooResponse)
.delay(101, TimeUnit.MILLISECONDS)
.map(new Function<String, Foo>() {
@Override public Interactions apply(String s) throws Exception {
return gson.fromJson(s, Foo.class);
}
});
以及JSON相關部分以下:
{
"bar": {
"type0": [
{
... object 0
}
],
"type1": [
{
... object 0
},
{
... object 1
}
]
},
"otherStuff" : {
}
}
json肯定格式正確,它來自我們的服務器,我已經在jsonlint.com上重新檢查過
解:
沒有自定義反序列化器似乎是不可能的。 所以我為String寫了一個序列化器,聽起來很糟糕,但是我很樂意接受有關處理它的更好方法的建議。
.registerTypeAdapter(String.class, new JsonDeserializer<String>() {
@Override
public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (json.isJsonPrimitive()) {
return json.getAsJsonPrimitive().getAsString();
} else {
return json.toString();
}
}
})
您收到此錯誤是因為您試圖解析JsonArray,但您應該在上述行中解析JsonObject。 希望對您有所幫助!! :)
當我嘗試此操作時,對我來說很好
public class Foo {
Map<String, List<Map>> bar = new HashMap<String, List<Map>>() ;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.