我對Java相當陌生,在過去的幾個小時裏我試圖尋找答案,至今我什麼都沒有。Gson從不一致的JSON導致的非法狀態異常
我正在與項目的諾貝爾API一起工作,當我嘗試從Json流轉換爲類時出現錯誤。
我的碼流中的閱讀是這樣的:
Gson gson = new Gson();
String sURL = "http://api.nobelprize.orgv1/laureate.json?bornCountry=Canada"; //just a string
// Connect to the URL using java's native library
URL url = new URL(sURL);
HttpURLConnection request = (HttpURLConnection) url.openConnection();
request.connect();
// Convert to a JSON object to print data
JsonParser jp = new JsonParser(); //from gson
JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); //Convert the input stream to a json element
JsonObject rootobj = root.getAsJsonObject(); //May be an array, may be an object.
LaureatesMain person = gson.fromJson(rootobj, LaureatesMain.class);
System.out.println(person);
}
我不檢查從流錯誤呢。
,我看JSON流看起來是這樣的:
{
"laureates": [
{
"id": "140",
// MORE STUFF
"prizes": [
{
"year": "1990",
// MORE STUFF
"affiliations": [
{
"name": "Stanford University",
"city": "Stanford, CA",
"country": "USA"
}
]
}
]
}
]
}
我對獲獎者,獎品和背景類,當它運行在的Json像上面我沒有問題,它會入課很好。
我遇到的問題是,如果有在隸屬關係沒有條目,然後由於某種原因,API翻轉{}爲[],使我有以下幾點:
{
"laureates": [
{
"id": "140",
// MORE STUFF
"prizes": [
{
"year": "1990",
// MORE STUFF
"affiliations": [[]
]
}
]
}
]
}
當我就這一個運行我得到Expected BEGIN_OBJECT
但道路是BEGIN_ARRAY
$.laureates[###].prizes[0].affiliations[0]
我試圖尋找改變GsonBuilder
並試圖攔截JSON和更改它進入Builder
之前,但至今沒有工作了我。
我無法控制從API獲取的內容。我可以處理它是一個空的類對象或最終結構中的空值。這是該項目的一個相當早期的迭代,但迄今爲止,這個問題阻止我轉向其他事情。
感謝
您將無法使用'LaureatesMain人= gson.fromJson(rootobj,LaureatesMain.class) ;'如果你不能控制服務器的數據格式。 – JakeWilson801
聽起來像這篇文章中的類似問題:[在Java中處理REST結果(json)中的不一致數據類型](http://stackoverflow.com/questions/38714747/handling-inconsistent-data-types-in-rest-results -json-在-java的)。你有沒有看過使用['TypeAdapter'](https://google.github.io/gson/apidocs/com/google/gson/TypeAdapter.html)? – avojak
即使您沒有直接的控制權,我也會向API提供者提交錯誤報告。 – dnault