2016-11-15 45 views
0

我對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獲取的內容。我可以處理它是一個空的類對象或最終結構中的空值。這是該項目的一個相當早期的迭代,但迄今爲止,這個問題阻止我轉向其他事情。

感謝

+0

您將無法使用'LaureatesMain人= gson.fromJson(rootobj,LaureatesMain.class) ;'如果你不能控制服務器的數據格式。 – JakeWilson801

+1

聽起來像這篇文章中的類似問題:[在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

+0

即使您沒有直接的控制權,我也會向API提供者提交錯誤報告。 – dnault

回答