簡體   English   中英

Gson解析為包含JsonArray的Object

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

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