2016-04-22 9 views
0

こんにちは私はアンドロイドVolleyを使ってサーバからJSONを取得し、それをオブジェクトに解析しています。 JSONレスポンスを解析するメソッドを持つクラスを作成しようとしています。私のURLは、例えば、次のとおりです。https://hacker-news.firebaseio.com/v0/item/11544988.json?print=prettyクラスメソッドを使用するときにJSON androidを解析する際にエラーが発生しました

はこちら(TopStory.javaで)私のクラスメソッドMainActivityで

public static TopStory fromJson(JSONObject jsonObject) { 
     TopStory topStory = new TopStory(); 

     // Deserialize json into object fields 
     try { 
      topStory.id = jsonObject.getInt(Constant.TAG_ID); 
      topStory.title = jsonObject.getString(Constant.TAG_TITLE); 
      topStory.author = jsonObject.getString(Constant.TAG_AUTHOR); 
      topStory.timestamp = jsonObject.getInt(Constant.TAG_TIMESTAMP); 
      topStory.url=jsonObject.getString(Constant.TAG_URL); 

     } catch (JSONException e) { 
      e.printStackTrace(); 
      return null; 
     } 
     // Return new object 
     return topStory; 
    } 

です。私はVolleyを使ってレスポンスを取得し、クラスメソッドを使用してオブジェクトを解析します。私は応答を得ることができます(表示するトーストを作ることができます)が、解析時にエラーが発生しました:java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.vic.hackernew.Model.TopStory.getAuthor()' on a null object reference。どんな助けでも大変感謝しています。ありがとう。

private void getTopStoryDetail(RequestQueue requestQueue, String topStoryUrl) { 

     progressBar.setVisibility(View.VISIBLE); 
     CustomJsonObjectRequest jsonObjectRequest = new CustomJsonObjectRequest(Request.Method.GET,topStoryUrl,null, 
       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject respond) { 
         progressBar.setVisibility(View.GONE); 

         Toast.makeText(getApplicationContext(),respond.toString(), Toast.LENGTH_LONG).show(); 

         TopStory topStory = TopStory.fromJson(respond); 

         topStories.add(topStory); 

         Toast.makeText(getApplicationContext(), topStory.getAuthor(), Toast.LENGTH_LONG).show(); 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show(); 
         progressBar.setVisibility(View.GONE); 
        } 
       }); 
     //Adding request to the queue 
     requestQueue.add(jsonObjectRequest); 
    } 

TopStory.java

package com.vic.hackernew.Model; 

import android.widget.Toast; 

import com.vic.hackernew.Utils.Constant; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.net.URL; 
import java.sql.Array; 
import java.sql.Timestamp; 
import java.util.ArrayList; 
import java.util.Arrays; 

/** 
* Created by vic on 21-Apr-16. 
*/ 
public class TopStory { 
    private int id; 
    private String title; 
    private String author; 
    private int score; 
    private int[] kids; 
    private int timestamp; 
    private String url; 

    public TopStory() { 
    } 

    public TopStory(int id, String title, String author, int point, int timestamp,String url) { 
     this.id = id; 
     this.title = title; 
     this.author = author; 
     this.score = point; 
     this.timestamp = timestamp; 
     this.url = url; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public String getAuthor() { 
     return author; 
    } 

    public void setAuthor(String author) { 
     this.author = author; 
    } 

    public int getScore() { 
     return score; 
    } 

    public void setScore(int score) { 
     this.score = score; 
    } 

    public int getTimestamp() { 
     return timestamp; 
    } 

    public void setTimestamp(int timestamp) { 
     this.timestamp = timestamp; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public int[] getKids() { 
     return kids; 
    } 

    public void setKids(int[] kids) { 
     this.kids = kids; 
    } 

    public String getUrl() { 
     return url; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 

    // Decodes business json into business model object 
    public static TopStory fromJson(JSONObject jsonObject) { 
     TopStory topStory = new TopStory(); 

     // Deserialize json into object fields 
     try { 
      topStory.id = jsonObject.getInt(Constant.TAG_ID); 
      topStory.title = jsonObject.getString(Constant.TAG_TITLE); 
      topStory.author = jsonObject.getString(Constant.TAG_AUTHOR); 
      topStory.timestamp = jsonObject.getInt(Constant.TAG_TIMESTAMP); 
      topStory.url=jsonObject.getString(Constant.TAG_URL); 

     } catch (JSONException e) { 
      e.printStackTrace(); 
      return null; 
     } 
     // Return new object 
     return topStory; 
    } 

マイConstanst.java

public class Constant { 
    public static String TAG_ID = "id"; 
    public static String TAG_TITLE = "title"; 
    public static String TAG_AUTHOR = "by"; 
    public static String TAG_KIDS = "kids"; 
    public static String TAG_SCORE = "point"; 
    public static String TAG_TIMESTAMP = "timestamp"; 
    public static String TAG_URL = "url"; 

    public static String TAG_CONTENT = "content"; 
    public static String TAG_BASE_URL = "https://hacker-news.firebaseio.com/v0/"; 
    public static String TAG_TOPSTORIES_URL = "topstories.json"; 
} 
+0

[Gson](https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/Gson.html)を使用しない理由は何ですか? – aProperFox

+0

あなたのモデルクラスを投稿する – mdDroid

+0

こんにちは、私はTopStory.java全体を追加しました –

答えて

0

私の全体のちょうど

topStory.author = jsonObject.optString(Constant.TAG_AUTHOR); 

の代わり

012を解析するには、この行を貼り付け
topStory.author = jsonObject.getString(Constant.TAG_AUTHOR); 

これで問題が解決された場合は、一部のアイテムのURLで問題が解決されました。

はそこらで、あなたがそれはあなたがそれに見れば、あなたはどんな著者のフィールドを見つけることができません

{ 

    "by": "maibaum", 
    "descendants": ​156, 
    "id": ​11544988, 
    "kids": 

    [ 
     ​11545261, 
     ​11546393, 
     ​11545187, 
     ​11546084, 
     ​11545168, 
     ​11546078, 
     ​11545846, 
     ​11546650, 
     ​11545285, 
     ​11545262, 
     ​11545178, 
     ​11546996, 
     ​11545394, 
     ​11546690, 
     ​11546275, 
     ​11545336, 
     ​11545515, 
     ​11545127, 
     ​11546000, 
     ​11546043, 
     ​11546842, 
     ​11546025, 
     ​11546221, 
     ​11545281, 
     ​11545142, 
     ​11546502, 
     ​11546215, 
     ​11546070, 
     ​11546257, 
     ​11546258, 
     ​11545195 
    ], 
    "score": ​238, 
    "time": ​1461269223, 
    "title": "FBI Paid More Than $1M to Hack San Bernardino iPhone", 
    "type": "story", 
    "url": "http://www.wsj.com/articles/comey-fbi-paid-more-than-1-million-to-hack-san-bernardino-iphone-1461266641" 

} 

あるreceievingされているJSONを見下ろしていました。だから、あなたはヌルをゲットしているのです。また、私はこの回答で "by"を参照してください。著者であれば、Constant.Authorを "author"の代わりに "by"に変更して、問題を解決できるはずです。 私はそれが役に立つと願っています。

+0

こんにちは、私はprobではないと思います。私のConstant.TAG_AUTHOR = "by"。私はtry { Toast.makeText(getApplicationContext()、respond.getString(Constant.TAG_AUTHOR)、Toast.LENGTH_LONG)の著者を得ることができます。 } catch(JSONException e){ e.printStackTrace(); } –

+0

定数クラスを貼り付けてください –

+0

質問にconstanst.javaを追加してください –

関連する問題