我正在使用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提供的。
我能,只要成功地爲RS
是RInfo
的對象,但在某些情況下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異常。
我已經嘗試過這種解決方案,但無法讓它正常工作。自定義反序列化是否可以處理更復雜的Json文件,例如我正在使用的文件? –
是的,可以使用更復雜的JSON。您的自定義解決方案有何錯誤? –
我已經用我所嘗試過的方式更新了我的初始文章。它似乎並沒有使用自定義解串器。 –