2015-05-03 141 views
0

我正在使用GSON將JSON數據解析爲Java,並且遇到標題中指出的錯誤。我與返回以下JSON數據的API工作:Gson如何避免期望的BEGIN_ARRAY但是BEGIN_OBJECT?

{ 
    "STATUS": "SUCCESS", 
    "NUM_RECORDS": "5", 
    "MESSAGE": "5 records found", 
    "AVAILABILITY_UPDATED_TIMESTAMP": "2015-05-03T13:59:08.541-07:00", 
    "AVAILABILITY_REQUEST_TIMESTAMP": "2015-05-03T13:59:08.490-07:00", 
    "AVL": [ 
    { 
     "TYPE": "ON", 
     "BFID": "205052", 
     "NAME": "5th St (500-598)", 
     "RATES": { 
     "RS": [ 
      { 
      "BEG": "12:00 AM", 
      "END": "12:00 PM", 
      "RATE": "0", 
      "RQ": "No charge" 
      }, 
      { 
      "BEG": "12:00 PM", 
      "END": "6:00 PM", 
      "RATE": "5", 
      "RQ": "Per hour" 
      }, 
      { 
      "BEG": "6:00 PM", 
      "END": "12:00 AM", 
      "RATE": "0", 
      "RQ": "No charge" 
      } 
     ] 
     }, 
     "PTS": "2", 
     "LOC": "-122.4002212834,37.7776161738,-122.3989619795,37.7766113458" 
    }, 
    { 
     "TYPE": "ON", 
     "BFID": "205042", 
     "NAME": "5th St (450-498)", 
     "RATES": { 
     "RS": { 
      "BEG": "12:00 AM", 
      "END": "12:00 AM", 
      "RATE": "0", 
      "RQ": "No charge" 
     } 
     }, 
     "PTS": "2", 
     "LOC": "-122.4015027158,37.7786330718,-122.4005149869,37.7778485214" 
    }, 
    ] 
} 

我可以看到哪裏出現問題,RS場可以包含對象的數組(我們稱之爲對象RInfo),或在某些情況下,將只包含數組中未包含的RInfo對象之一。我認爲發生錯誤是因爲GSON正在尋找一個數組,但找到了一個對象。我無法更改JSON文件的結構,因爲它是由API提供的。

我能,只要成功地爲RSRInfo的對象,但在某些情況下RS數組解析信息包含這樣出現此錯誤只有一個RInfo對象。

有沒有辦法在GSON中處理這個問題?

*更新

我已經試過了更早連接的解決方案。以下是我從該解決方案有:

class RSDeserializer implements JsonDeserializer<RateInfo[]> { 

    @Override 
    public RateInfo[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
      throws JsonParseException 
    { 


     if (json instanceof JsonArray) { 
      System.out.println("fromJson in RSD:" + new Gson().fromJson(json, RateInfo[].class)); 
      return new Gson().fromJson(json, RateInfo[].class); 
     } 
     RateInfo rI = context.deserialize(json, RateInfo.class); 

     return new RateInfo[] { rI }; 
    } 

} 

我還創建了一個新的GsonBuilder

GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.registerTypeAdapter(RateInfo[].class, new RSDeserializer()); 
    Gson gson = gsonBuilder.create(); 

它似乎並不像自定義解串器被使用過,因爲打印語句從未如下打印在控制檯中。之後,我嘗試使用MyOBJ info = gson.fromJson(json, MyOBJ.class);對這個json進行deserilize,這一行給了我期望的BEGIN_ARRAY,但是是BEGIN_OBJECT異常。

+0

我已經嘗試過這種解決方案,但無法讓它正常工作。自定義反序列化是否可以處理更復雜的Json文件,例如我正在使用的文件? –

+0

是的,可以使用更復雜的JSON。您的自定義解決方案有何錯誤? –

+0

我已經用我所嘗試過的方式更新了我的初始文章。它似乎並沒有使用自定義解串器。 –

回答

0

必須更新解串器來告訴您要返回List<RateInfo>

class RSDeserializer implements JsonDeserializer<List<RateInfo>> { 
    @Override 
    public List<RateInfo> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     if (json instanceof JsonArray) { 
      return Arrays.asList(context.deserialize(json, RateInfo[].class)); 
     } 
     return Collections.singletonList(context.deserialize(json, RateInfo.class)); 
    } 
} 

,你還需要告訴解析器,這是要反序列化也註冊這個適配器時的類型:

Type t = new TypeToken<List<RateInfo>>(){}.getType(); 
Gson gson = new GsonBuilder().registerTypeAdapter(t, new RSDeserializer()).create(); 

一個完整的工作示例可以在我的gist中找到。

相關問題