最后查看解决方案。
原始问题
我的代码中有以下对象,我正在尝试使用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();
}
}
})
答案 0 :(得分:1)
您遇到此错误是因为您尝试解析JsonArray但是您应该在上面提到的行解析JsonObject。 我希望它会有所帮助!! :)
答案 1 :(得分:0)
当我尝试这个时,它对我来说很好,
public class Foo {
Map<String, List<Map>> bar = new HashMap<String, List<Map>>() ;
}