2016-11-15 4 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ストリームは次のようなものになります。私は、受賞者、賞および所属のクラスを持っており、それは上記のようなJSON上で実行したときに、私は何の問題を持っていないし、それが行く

{ 
    "laureates": [ 
     { 
      "id": "140", 
      // MORE STUFF 
      "prizes": [ 
       { 
        "year": "1990", 
        // MORE STUFF 
        "affiliations": [ 
         { 
          "name": "Stanford University", 
          "city": "Stanford, CA", 
          "country": "USA" 
         } 
        ] 
       } 
      ] 
     } 
    ] 
} 

をクラスの罰金に。

次が所属にエントリがAPIを{} []に切り替え、何らかの理由で、その後はありませんし、私を与えた場合、私はに実行して問題がある:

私はこの1つ上で実行
{ 
    "laureates": [ 
     { 
      "id": "140", 
      // MORE STUFF 
      "prizes": [ 
       { 
        "year": "1990", 
        // MORE STUFF 
        "affiliations": [[] 
        ] 
       } 
      ] 
     } 
    ] 
} 

私はExpected BEGIN_OBJECTを取得するが、私はGsonBuilderを変更見てみましたとJSONを傍受し、それがBuilderに入る前に、それを変更しようとしましたが、今のところ何ものために働いていないしているパス

$.laureates[###].prizes[0].affiliations[0] 

BEGIN_ARRAYました私。

私はAPIから何を得るかについては何の支配もしていません。私はそれが空のクラスオブジェクトであるか、最終構造体のヌル値であることに対処できます。これはプロジェクトのかなり初期の反復ですが、今のところこの問題は私が他のものに移行するのを止めています。

ありがとうございました

+0

= gson.fromJson(rootobj、LaureatesMain.class) ; 'サーバーからのデータ形式を制御できない場合。 – JakeWilson801

+1

このポストと同様の問題のようです:[REST結果(json)のJavaでの不整合なデータ型の処理](http://stackoverflow.com/questions/38714747/handling-inconsistent-data-types-in-rest-results) -json-in-java)。 ['TypeAdapter'](https://google.github.io/gson/apidocs/com/google/gson/TypeAdapter.html)を使用してみましたか? – avojak

+0

あなたが直接コントロールすることはできませんが、私はAPIプロバイダにバグレポートを提出します。 – dnault

答えて

0

私は自分の質問に答えるので、私はそれを閉じることができます。

タイプアダプターを使用してしまったので、私に指示してくれてありがとう。一度私が探していたものを知ったら、あまりにも難しくありませんでした。

がで次のようにJavaのドキュメントで本当に良い情報が見つかりました:あなたは `LaureatesMain人を使用することはできません

https://google.github.io/gson/apidocs/com/google/gson/TypeAdapter.html

https://static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google/gson/stream/JsonReader.html

関連する問題