Gson解析为包含JsonArray的Object

时间:2017-01-31 12:21:35

标签: java android gson

最后查看解决方案。

原始问题

我的代码中有以下对象,我正在尝试使用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();
        }
    }
})

2 个答案:

答案 0 :(得分:1)

您遇到此错误是因为您尝试解析JsonArray但是您应该在上面提到的行解析JsonObject。 我希望它会有所帮助!! :)

答案 1 :(得分:0)

当我尝试这个时,它对我来说很好,

public class Foo {

    Map<String, List<Map>> bar = new HashMap<String, List<Map>>() ;

}