2017-08-04 47 views
0

私が作成しているアプリでは、GoogleブックAPIから書籍を検索します。たとえば、このリンクを考えてみよう。https://www.googleapis.com/books/v1/volumes?q=phpJSONException:pageCountの値がありません

私が望むjsonオブジェクトをリストビューとして表示し、行がクリックされたときにブックの詳細データで新しいアクティビティを開始することができます。クラッシュすることなくすべてが画面に表示されても、次の例外が発生します。

08-04 09:30:07.897 29829-30069/com.example.android.booklist 
W/System.err: org.json.JSONException: No value for pageCount 

私は正に、なぜこれが起こっているのかわかりません。 pageCount intを取得するコード行をデバッグすると、問題なくページ数が読み込まれます。ここで私のJSsonのコードを解析します。

private static List<Book> extractFeatureFromJson(String bookJson){ 

    if(TextUtils.isEmpty(bookJson)){ 
     return null; 
    } 
    // Create an empty ArrayList that we can start adding earthquakes to 
    List<Book> books = new ArrayList<>(); 
    String thumbnail=null; 
    try { 
     JSONObject baseJSON = new JSONObject(bookJson); 

     JSONArray itemsJsonArray = baseJSON.getJSONArray("items"); 

     for(int i = 0;i<itemsJsonArray.length(); i++){ 
      JSONObject item = itemsJsonArray.getJSONObject(i); 
      JSONObject volumeInfo = item.getJSONObject("volumeInfo"); 

      String title = volumeInfo.getString("title"); 

      JSONArray authorsArray = volumeInfo.getJSONArray("authors"); 
      String authors = formatListOfAuthors(authorsArray); 

      String language = volumeInfo.getString("language"); 
      String date = volumeInfo.getString("publishedDate"); 

      // This line gives me the described exception. 
      int pageCount = volumeInfo.getInt("pageCount"); 

      if(volumeInfo.has("imageLinks")){ 

       JSONObject imageLinks = volumeInfo.getJSONObject("imageLinks"); 
       thumbnail = imageLinks.getString("smallThumbnail"); 
      } 

      Book b = new Book(title,authors,thumbnail,date,language,pageCount); 

      books.add(b); 
     } 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    return books; 
} 

実際のjsonレスポンスについては、質問の冒頭でリンクを確認できます。ありがとう、

Theo。

+2

'pageCount'はオプションのプロパティです(10個の結果をリンクすると9個だけにpageCountがあります)。解析する前に、存在するかどうかチェックする必要があります。 – MatPag

+1

@MatPag、リンクされたJSONに10個の 'pageCount'項目があります。おそらくそれはいくつかの条件によって変化します。 –

+1

@MatPag、あなたが正しいテーマです。別のクエリでは、私は10のうち9つにpageCountを取得します。これは、例えばhttps://www.googleapis.com/books/v1/volumes?q=c++ –

答えて

3

pageCountはオプションのプロパティです(10個の結果のリンクでは、9個にpageCountしかありません)。

解析する前に、プロパティが存在するかどうかを確認する必要があります。

あなたは2つの選択肢があります。値を取得する

//this will give you 0 as default if pageCount not exists 
int pageCount = volumeInfo.optInt("pageCount"); 

2 - チェックをしようとしたときに、プロパティを

//this will set pageCount value only if pageCount exists 
if (volumeInfo.has("pageCount")){ 
    int pageCount = volumeInfo.getInt("pageCount"); 
} 

ブックを、それを取得する前に存在している場合

1-デフォルト値を使用しますAPIには少しの資料がありません。 hereを検索した場合、volumeInfo.pageCountはオプション性についてのメモがありません

+1

Yeap。それはトリックです。あの先生に感謝します。 – Theo

関連する問題