2017-02-25 69 views
-4

私はニュースフォームjsonを取得しようとしています。 しかし私は活動の代わりに断片で働いています。volleyエラーorg.json.JSONException:値がありません

私はコードにエラーはありませんが、私がアプリケーションを実行すると、コンソールとlogcatのエラー "org.json.JSONException:No value for newsItem"が表示されます。

これは私のfragment.java

import android.os.Bundle; 
    import android.support.annotation.NonNull; 
    import android.support.annotation.Nullable; 
    import android.support.v4.app.Fragment; 
    import android.util.Log; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.ArrayAdapter; 
    import android.widget.ImageView; 
    import android.widget.ListView; 
    import android.widget.TextView; 

    import com.android.volley.Request; 
    import com.android.volley.RequestQueue; 
    import com.android.volley.Response; 
    import com.android.volley.VolleyError; 
    import com.android.volley.toolbox.JsonObjectRequest; 
    import com.android.volley.toolbox.Volley; 
    import com.comp.app.news.R; 
    import com.comp.app.news.activities.NewsItems; 

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

    import java.util.ArrayList; 
    import java.util.List; 


    public class NewsFragment extends Fragment { 

private List<NewsItems> newsFeed = new ArrayList<>(); 

public NewsFragment() { 
    // Required empty public constructor 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_news, container, false); 

} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    getActivity().setTitle("News"); 

    RequestQueue queue = Volley.newRequestQueue(getActivity().getApplicationContext()); 

    JsonObjectRequest newsReq = new JsonObjectRequest(Request.Method.GET, 
      "https://raw.githubusercontent.com/sumbganesh/temp/master/convertjson.json", 
      null, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        try { 
        JSONArray NewsItems = response.getJSONArray("newsItems"); 

         for (int i = 0; i < NewsItems.length(); i++) { 

          JSONObject temp = NewsItems.getJSONObject(i); 

          String title = temp.getString("title"); 
          String description = temp.getString("description"); 
          String url = temp.getString("url"); 
          String urlToImage = temp.getString("urlToImage"); 

          newsFeed.add(new NewsItems(title, description, url, urlToImage)); 
         } 
        } catch (JSONException e){ 
         e.printStackTrace(); 
        } 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 

       } 
      }); 

    queue.add(newsReq); 

    ArrayAdapter<NewsItems> adapter = new customAdapter(); 

    ListView news_list =(ListView) (getActivity().findViewById(R.id.newsList)); 
    news_list.setAdapter(adapter); 
} 

private class customAdapter extends ArrayAdapter<NewsItems>{ 
    customAdapter() { 
     super(getActivity(), R.layout.custom_list, newsFeed); 
    } 

    @NonNull 
    @Override 
    public View getView(int position, View convertView, @NonNull ViewGroup parent) { 

     if (convertView == null){ 
      convertView = getActivity().getLayoutInflater().inflate(R.layout.custom_list, parent, false); 
     } 
     NewsItems currentItem = newsFeed.get(position); 

     ImageView newsImage = (ImageView) convertView.findViewById(R.id.leftIco); 
     TextView newsHeading = (TextView) convertView.findViewById(R.id.heading); 
     TextView newsDesc = (TextView) convertView.findViewById(R.id.description); 

     newsImage.setImageResource(R.mipmap.ic_launcher); 
     newsHeading.setText(currentItem.getNewsTitle()); 
     newsDesc.setText(String.valueOf((currentItem.getNewsDescription()))); 

     return convertView; 
      } 
     } 
    } 

である。これはNewsItem.java

public class NewsItems { 
private String newsTitle; 
private String newsDescription; 
private String newsUrl; 
private String imageUrl; 

public NewsItems(String newsTitle, String newsDescription, String newsUrl, String imageUrl) { 
    this.newsTitle = newsTitle; 
    this.newsDescription = newsDescription; 
    this.newsUrl = newsUrl; 
    this.imageUrl = imageUrl; 
} 


public String getNewsTitle() { 
    return newsTitle; 
} 

public String getNewsDescription() { 
    return newsDescription; 
} 

public String getNewsUrl() { return newsUrl; } 

public String getImageUrl() { return imageUrl; } 
} 

であり、これは

W/System.err: org.json.JSONException: No value for newsItems 
    W/System.err:  at org.json.JSONObject.get(JSONObject.java:389) 
    W/System.err:  at org.json.JSONObject.getJSONArray(JSONObject.java:584) 
    W/System.err:  at com.comp.app.news.fragments.NewsFragment$1.onResponse(NewsFragment.java:68) 
    W/System.err:  at com.comp.app.news.fragments.NewsFragment$1.onResponse(NewsFragment.java:64) 
    W/System.err:  at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65) 
    W/System.err:  at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 
    W/System.err:  at android.os.Handler.handleCallback(Handler.java:751) 
    W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
    W/System.err:  at android.os.Looper.loop(Looper.java:154) 
    W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:6119) 
    W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
    W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
    W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

コンソールでエラーになりありがとうございました。 は編集:私はNewsItem.javaクラスを追加するのを忘れて、申し訳ありません

編集:

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    getActivity().setTitle("News"); 

    RequestQueue queue = Volley.newRequestQueue(getActivity().getApplicationContext()); 

    JsonObjectRequest newsReq = new JsonObjectRequest(Request.Method.GET, 
      "https://raw.githubusercontent.com/sumbganesh/temp/master/news.json", 
      null, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        try { 
         JSONArray NewsItems = response.getJSONArray("articles"); 

         for (int i = 0; i < NewsItems.length(); i++) { 

          JSONObject temp = NewsItems.getJSONObject(i); 

          String title = temp.optString("title"); 
          String description = temp.optString("description"); 
          String url = temp.optString("url"); 
          String urlToImage = temp.optString("urlToImage"); 

          newsFeed.add(new NewsItems(title, description, url, urlToImage)); 
         } 
        } catch (JSONException e){ 
         Log.i("myTag", e.toString()); 
         e.printStackTrace(); 
        } 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 

        Log.i("myTag", error.toString()); 

       } 
      }); 

    queue.add(newsReq); 

    ArrayAdapter<NewsItems> adapter = new customAdapter(); 

    ListView news_list =(ListView) (getActivity().findViewById(R.id.newsList)); 
    news_list.setAdapter(adapter); 
} 

これは、レイアウトファイル

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    app:srcCompat="@mipmap/ic_launcher" 
    android:id="@+id/leftIco" 
    android:maxHeight="50dp" 
    android:maxWidth="50dp"/> 

<TextView 
    android:text="Heading" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_toRightOf="@+id/leftIco" 
    android:layout_toEndOf="@+id/leftIco" 
    android:layout_marginLeft="23dp" 
    android:layout_marginStart="23dp" 
    android:id="@+id/heading" /> 

<TextView 
    android:text="Description" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/heading" 
    android:layout_alignLeft="@+id/heading" 
    android:layout_alignStart="@+id/heading" 
    android:id="@+id/description" /> 

</RelativeLayout> 
+2

newsItemの値が含まれているかどうかを確認してください。 – tahsinRupam

+0

[Android-JSONExceptionの値はありません](http://stackoverflow.com/questions/15477304/android-jsonexception-no-value-for) –

答えて

0
import android.os.Bundle; 
    import android.support.annotation.NonNull; 
    import android.support.annotation.Nullable; 
    import android.support.v4.app.Fragment; 
    import android.util.Log; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.ArrayAdapter; 
    import android.widget.ImageView; 
    import android.widget.ListView; 
    import android.widget.TextView; 

    import com.android.volley.Request; 
    import com.android.volley.RequestQueue; 
    import com.android.volley.Response; 
    import com.android.volley.VolleyError; 
    import com.android.volley.toolbox.JsonObjectRequest; 
    import com.android.volley.toolbox.Volley; 
    import com.comp.app.news.R; 
    import com.comp.app.news.activities.NewsItems; 

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

    import java.util.ArrayList; 
    import java.util.List; 


    public class NewsFragment extends Fragment { 

    private List<NewsItems> newsFeed = new ArrayList<>(); 

    public NewsFragment() { 
    // Required empty public constructor 
    } 

    @Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.fragment_news, container, false); 

    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
super.onViewCreated(view, savedInstanceState); 
getActivity().setTitle("News"); 

RequestQueue queue = Volley.newRequestQueue(getActivity().getApplicationContext()); 

JsonObjectRequest newsReq = new JsonObjectRequest(Request.Method.GET, 
     "https://raw.githubusercontent.com/sumbganesh/temp/master/convertjson.json", 
     null, 
     new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       try { 
       JSONArray NewsItems = response.getJSONArray("newsItems"); 

        for (int i = 0; i < NewsItems.length(); i++) { 
NewsItems item = new NewsItems(); 
         JSONObject temp = NewsItems.getJSONObject(i); 

         String title = temp.getString("title"); 
         String description = temp.getString("description"); 
         String url = temp.getString("url"); 
         String urlToImage = temp.getString("urlToImage"); 

         newsFeed.add(new NewsItems(title, description, url, urlToImage)); 
        } 
       } catch (JSONException e){ 
        e.printStackTrace(); 
       } 
      } 
     }, 
     new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 

      } 
     }); 

    queue.add(newsReq); 

ArrayAdapter<NewsItems> adapter = new customAdapter(newsFeed,getActivity()); 

ListView news_list =(ListView) (getActivity().findViewById(R.id.newsList)); 
news_list.setAdapter(adapter); 
} 

private class customAdapter extends ArrayAdapter<NewsItems>{ 
Context context; 
customAdapter(ArrayList<NewsItems> newsFeed, Context context) { 
    super(getActivity(), R.layout.custom_list, newsFeed); 
    this.newsFeed = newsFeed; 
    this.context = context; 
} 

@NonNull 
@Override 
public View getView(int position, View convertView, @NonNull ViewGroup parent) { 

    if (convertView == null){ 
     convertView = getActivity().getLayoutInflater().inflate(R.layout.custom_list, parent, false); 
    } 
    NewsItems currentItem = newsFeed.get(position); 

    ImageView newsImage = (ImageView) convertView.findViewById(R.id.leftIco); 
    TextView newsHeading = (TextView) convertView.findViewById(R.id.heading); 
    TextView newsDesc = (TextView) convertView.findViewById(R.id.description); 

    newsImage.setImageResource(R.mipmap.ic_launcher); 
    newsHeading.setText(currentItem.getNewsTitle()); 
    newsDesc.setText(String.valueOf((currentItem.getNewsDescription()))); 

    return convertView; 
     } 
    } 
} 
+0

私は E/EGL_emulationを得た:TIDの26503:eglSurfaceAttrib(1174):エラー0x3009(EGL_BAD_MATCH) W/OpenGLRenderer:表面0x7903a49a38c0にEGL_SWAP_BEHAVIORの設定に失敗しました、あなたが更新されたコードを投稿することができ、エラー= EGL_BAD_MATCH – Ganesh

+0

は私がチェックできるように –

+0

を問題の編集済みコードを追加しました。変数NewsItemとモデルNewsItemが一致するため、 – Ganesh

0

であるあなたがjsonObjectとしてrootを持っているJSONを使用しているすべての最初とJSONArrayはarticlesです。ですから、このhttps://raw.githubusercontent.com/sumbganesh/temp/master/convertjsonファイルで

JSONArray NewsItems = response.getJSONObject("root").getJSONArray("articles"); 

代わりの

JSONArray NewsItems = response.getJSONArray("newsItems"); 
+0

実際には、テスト用にjsonファイルを使用しています。私のorignal jsonファイルにはルートがありません。 (ここで確認してくださいhttps://raw.githubusercontent.com/sumbganesh/temp/master/news.json) – Ganesh

+0

W/OpenGLRenderer:表面0x7903a49ff4c0にEGL_SWAP_BEHAVIORを設定できませんでした.JSONArray NewsItems = responseを使用するとエラー= EGL_BAD_MATCHになりました。 getJSONObject( "ルート")。getJSONArray( "articles"); – Ganesh

0

を使用する必要がある、のNewsItemの値はありません。 それが価値を得られなかった理由です。

+0

私は記事に変更しました。 – Ganesh

+0

ここでarticles配列はルートオブジェクトの下にあります。 response.getJSONArray( "articles")を置き換える必要があります。 response.getJSONObject( "root")。getJSONArray( "articles");レスポンスを返します。 –

+0

https://raw.githubusercontent.com/sumbganesh/temp/master/news.jsonが私のorignalファイルです。 – Ganesh

関連する問題