【问题标题】:How to Parsing Android JsonObject and storing it after storing the Object with JsonArray inside RecyclerView如何在 RecyclerView 中使用 JsonArray 存储对象后解析 Android JsonObject 并存储它
【发布时间】:2016-03-01 19:46:51
【问题描述】:

我试图解析Json,如下所示:

     {
      "status": "ok",
      "feed": {
        "title": "title1",
        "link": "http://www.link/",
        "author": "",
        "description": "desc",
        "image": ""
      },
      "items": [
        {
          "title": "something",
          "link": "something",
          "guid": "something",
          "pubDate": "date",
          "categories": [],
          "author": "",
          "thumbnail": "",
          "description": null,
          "content": null
        },
...
...

我从response 得到了预期的结果,但这不是重点。这就是我所做的:

try {

            JSONObject response = new JSONObject(result);

            JSONObject feed_object = response.getJSONObject("feed");
            PostItems item = new PostItems();
            item.setAuthor(feed_object.getString("title"));

            JSONArray items_arr = response.getJSONArray("items");
            for (int i = 0; i < items_arr.length(); i++) {
                JSONObject post = items_arr.getJSONObject(i);

                item.setTitle(post.getString("title"));
                item.setDate(post.getString("pubDate")); // As expected results

                feedItem.add(item);
            }

        }

关键是,如果我存储(first object就像我到目前为止所做的上述代码RecyclerView 正在显示项目但没有在项目内设置正确的titledate

如果我将它存储在数组中,然后在数组内部(对于array)和array 之外设置一个,它只会显示如下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
               at java.io.StringReader.<init>(StringReader.java:47)
               at android.text.HtmlToSpannedConverter.convert(Html.java:449)
               at android.text.Html.fromHtml(Html.java:136)
               at android.text.Html.fromHtml(Html.java:99)
               at client.com.news.RecyclerViews.MainSanjeshRecyclerView.MyRecyclerAdapter.onBindViewHolder(MyRecyclerAdapter.java:34)
               at client.com.news.RecyclerViews.MainSanjeshRecyclerView.MyRecyclerAdapter.onBindViewHolder(MyRecyclerAdapter.java:14)
               at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5465)
               at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5498)
               at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4735)
               at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4611)
               at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1988)
               at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1384)
               at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1347)
               at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574)
               at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3026)
               at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2903)
               at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3277)
               at android.view.View.layout(View.java:16630)
               at android.view.ViewGroup.layout(ViewGroup.java:5437)
               at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:596)
               at android.view.View.layout(View.java:16630)
               at android.view.ViewGroup.layout(ViewGroup.java:5437)
               at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1684)
               at android.view.View.layout(View.java:16630)
               at android.view.ViewGroup.layout(ViewGroup.java:5437)
               at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:122)
               at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
               at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1139)
               at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:810)
               at android.view.View.layout(View.java:16630)
               at android.view.ViewGroup.layout(ViewGroup.java:5437)
               at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
               at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
               at android.view.View.layout(View.java:16630)
               at android.view.ViewGroup.layout(ViewGroup.java:5437)
               at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
               at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
               at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
               at android.view.View.layout(View.java:16630)
               at android.view.ViewGroup.layout(ViewGroup.java:5437)
               at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
               at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
               at android.view.View.layout(View.java:16630)
               at android.view.ViewGroup.layout(ViewGroup.java:5437)
               at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
               at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
               at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
               at android.view.View.layout(View.java:16630)
               at android.view.ViewGroup.layout(ViewGroup.java:5437)
               at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
               at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
               at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678)
               at android.view.View.layout(View.java:16630)
               at android.view.ViewGroup.layout(ViewGroup.java:5437)
               at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2171)
            at android.vi

第二次尝试:

try {

                JSONObject response = new JSONObject(result);

                JSONObject feed_object = response.getJSONObject("feed");
                PostItems item = new PostItems();
                item.setAuthor(feed_object.getString("title"));

                JSONArray items_arr = response.getJSONArray("items");
                for (int i = 0; i < items_arr.length(); i++) {
                    JSONObject post = items_arr.getJSONObject(i);
                    PostItems item2 = new PostItems();
                    item2.setTitle(post.getString("title"));
                    item2.setDate(post.getString("pubDate"));

                    feedItem.add(item2);
                }
                feedItem.add(item);
            }

实际上,我已经尝试了任何你能想象到的东西,并在 stackoverflow 上看到了任何问题,但我找不到类似这样的问题,但是有一次,只显示一个项目而没有来自对象的正确数据,有一次没有显示来自Array 的正确数据。

任何帮助都会很棒。

【问题讨论】:

  • 什么是行MyRecyclerAdapter.java:34
  • 就是这样,feedListRowHolder.author.setText(Html.fromHtml(feedItem.getAuthor())); 但我认为这不是重点,只有当我像第二个代码一样尝试设置这条线两次时才会发生这种情况:feedItem.add(item2); feedItem.add(item);
  • getAuthor 返回空值。附注:PostItems item = new PostItems(); 应该在 for 循环的每次迭代中实例化——Blackbelt 刚刚编辑
  • 我是这么想的,但是一直显示上面的结果(错误)
  • 您没有在代码中的任何地方解析作者。为什么你期望 getAuthor 返回一些东西!= null?

标签: java android arrays json


【解决方案1】:

您试图在每个项目中使用getAuthor(),但显然它仅用于ArrayList 中的一个(第一个)项目。当它没有任何值时,它返回null,结果为NullPointerException。每次迭代都应该创建新对象。

动起来

PostItems item = new PostItems();
item.setAuthor(feed_object.getString("title"));

for 循环内。

编辑

try {
    JSONObject response = new JSONObject(result);

    JSONObject feed_object = response.getJSONObject("feed");

    JSONArray items_arr = response.getJSONArray("items");
    for (int i = 0; i < items_arr.length(); i++) {
        JSONObject post = items_arr.getJSONObject(i);
        PostItems item = new PostItems();
        item.setAuthor(feed_object.getString("title")); // being fetched from top node
        item.setTitle(post.getString("title")); // being fetched from array
        item.setDate(post.getString("pubDate")); // being fetched from array

        feedItem.add(item);
    }

}

【讨论】:

  • 没用,我说的不是这个,请阅读cmets。
  • 请将您的代码与我的匹配。试试这个代码。
  • 太好了,所以重点是在每个循环中使用这些代码,别想了
  • 当然,永远不要考虑它:),我花了大约一天的时间!谢谢
猜你喜欢
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 2021-09-20
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多