当前位置: 首页 > 知识库问答 >
问题:

无法在Android logcat中检索完整的json响应,并给出错误或解析

巫马刚洁
2023-03-14

我正在开发一个应用程序并发出一个http请求,该请求运行良好,

这是我的异步类Doinbackground方法:

@Override
    protected String doInBackground(Void... arg0) {


        HttpHandler sh = new HttpHandler();

        // Making a request to url and getting response
        String jsonStr = sh.makeServiceCall(url);

        Log.d("Response ==>", "Response from url: ");
        longInfo(jsonStr);
        return jsonStr; 
    }

这就是我使用的逻辑

        public void longInfo(String str) {
        if(str.length() > 4000) {
            Log.e("TAG", str.substring(0, 4000));
            longInfo(str.substring(4000));
        } else
            Log.e("TAG", str);
    }

但这给了我大量的json字符串,它破坏了json格式,我无法相应地解析对象和数组。好心帮忙

这里是我的json解析方法

 public void parsejsonp(String jsonp){


        if (jsonp != null) {
            try {
                JSONObject jsonObj = new JSONObject(jsonp);
                int count = jsonObj.getInt("count");
                Log.e("count=> ",count+"");

                int count_total = jsonObj.getInt("count_total");
                Log.e("count_total=> ",count_total+"");

                int pages = jsonObj.getInt("pages");
                Log.e("pages=> ",pages+"");


                // Getting JSON Array node
                JSONArray Posts = jsonObj.getJSONArray("posts");

                // looping through All Posts
                for (int i = 0; i < Posts.length(); i++) {
                    JSONObject c = Posts.getJSONObject(i);

                    String id = c.getString("id");
                    String type = c.getString("type");
                    String slug = c.getString("slug");
                    String status = c.getString("status");
                    String title = c.getString("title");

                    String title_plain = c.getString("title_plain");

                    String content = c.getString("content");

                    String date = c.getString("date");

                    String modified = c.getString("modified");




                    // Phone node is JSON Object
                    //                     JSONObject phone = c.getJSONObject("phone");
                    //                   String mobile = phone.getString("mobile");
                    //                 String home = phone.getString("home");
                    //               String office = phone.getString("office");

                    // tmp hash map for single contact
                    HashMap<String, String> posting = new HashMap<>();

                    // adding each child node to HashMap key => value
                    posting.put("id", id);
                    posting.put("type", type);
                    posting.put("slug", slug);
                    posting.put("status",status);
                    posting.put("title", title);
                    posting.put("content", content);
                    posting.put("date", date);
                    posting.put("modified", modified);


                    // adding contact to contact list
                    postList.add(posting);
                }
            } catch (final JSONException e) {
                Log.e("error", "Json parsing error: " + e.getMessage());
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getActivity(),
                                "Json parsing error: " + e.getMessage(),
                                Toast.LENGTH_LONG)
                                .show();
                    }
                });

            }
        } else {
            Log.e("er server", "Couldn't get json from server.");
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getActivity(),
                            "Couldn't get json from server. Check LogCat for possible errors!",
                            Toast.LENGTH_LONG)
                            .show();
                }
            });

        }

    }

这是我的onPost方法:

@Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);


            Log.e("RESULT",result);

            parsejsonp(result);
            // Dismiss the progress dialog
            if (pDialog.isShowing())
                pDialog.dismiss();
            /**
             * Updating parsed JSON data into ListView
             * */
            ListAdapter adapter = new SimpleAdapter(
                    getActivity(), postList,
                    R.layout.list_item2, new String[]{"type", "slug","status",
                    "title","content","date","modified"}, new int[]{R.id.type,
                    R.id.slug,R.id.state_p,R.id.title_p, R.id.content,R.id.date_p,R.id.moddate_p});

            lv.setAdapter(adapter);
        }

但是我仍然无法解析所有的数据,因为仍然在结果参数的onPost方法中,我没有完整的响应

我还检查了浏览器上的url,响应完全显示在那里。但是,如果由于缓冲区大小的原因,它没有完全显示在logcat中,那么它必须将所有数据放在我的listview中,但它不是

这是我的listview的屏幕截图

正如您所看到的,只插入了一个对象数据,但未插入响应的其余部分,我已调试了所有代码并检查了arraylist大小,因为它存储了完整数量的对象,但我的屏幕似乎只显示了一个对象数据:

这是我的布局。xml文件可能存在以下问题:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".fragment">



    <android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="fill_vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">


        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context="com.adnan.zwd.hidoctor.Patient.Frag_two">

            <ListView
                android:id="@+id/list2"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" />
        </RelativeLayout>




    </android.support.v4.widget.NestedScrollView>

</RelativeLayout>

row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="@dimen/activity_horizontal_margin">

    <TextView
        android:id="@+id/type"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="2dip"
        android:paddingTop="6dip"
        android:text="type"
        android:textColor="@color/colorPrimaryDark"
        android:textSize="16sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/slug"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="slug"
        android:paddingBottom="2dip"
        android:textColor="@color/colorAccent" />
    <TextView
        android:id="@+id/state_p"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="status"
        android:paddingBottom="2dip"
        android:textColor="@color/colorAccent" />

    <TextView
        android:id="@+id/title_p"
        android:text="title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#5d5d5d"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/content"
        android:text="content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#5d5d5d"
        android:textStyle="bold" />
    <TextView
        android:id="@+id/date_p"
        android:text="date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#5d5d5d"
        android:textStyle="bold" />
    <TextView
        android:id="@+id/moddate_p"
        android:text="Mod Date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#5d5d5d"
        android:textStyle="bold" />

</LinearLayout>

关于这个问题的任何帮助,我在网上搜索了很多,但没有成功

共有3个答案

轩辕海
2023-03-14

Android_Studio_Path\bin\idea.properties

更改Buffersize并将其增加到2048

idea.cycle.buffer.size=1024
危晨
2023-03-14

最后我发现了问题。这一切的发生都是因为android。支持v4。小装置。我的布局中的嵌套滚动视图

我通过在nestedscrollview中添加android:fillViewport=“true”属性解决了这个问题

如本文所述:

ListView未在NestedScrollView内展开

呼延晋
2023-03-14

它为解析提供了一个例外。

什么例外?也许在这里?

new JSONObject(str.substring(4000));

您不能只切割JSONObject的中间部分。第一个{[字符很重要。

您可以使用JsonReader类来解析InputStream,而不是将该流读入BufferedReader,然后读入字符串。

您不需要从该方法进行解析。该字符串已在内存中,以便传递到该方法中。

@Override
protected String doInBackground(Void... arg0) {
    HttpHandler sh = new HttpHandler();

    // Making a request to url and getting response
    String jsonStr = sh.makeServiceCall(url);

    Log.d("Response ==>", "Response from url: ");
    longInfo(jsonStr);
    return jsonStr;  // change your AsyncTask from Void to String return type 
}

// standalone method 
public static void longInfo(String str) {
    if(str.length() > 4000) {
        Log.i(TAG, str.substring(0, 4000));
        longInfo(str.substring(4000));
    } else
        Log.i(TAG, str);
}

这是我的layout.xml文件可能问题就在这里

是的,有个问题。

您不应该将ScrollView与ListView一起使用,因为ListView负责自己的垂直滚动

Android | ScrollView

这是所有你需要的碎片布局

<?xml version="1.0" encoding="utf-8"?>
<ListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/list2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
/>
 类似资料:
  • 问题内容: 对于为什么我无法使用urllib2从FriendFeed下载一些JSON响应的全部内容,我感到困惑。 如何使用urllib2检索完整响应? 问题答案: 获取所有数据的最佳方法: 原因是考虑到套接字的性质,不能保证返回整个响应。我以为是在文档中讨论过的(也许是),但找不到。

  • 问题内容: 我正在使用JSch连接到SSH并执行命令。其中一个命令给出了很大的输出。在终端中,如果执行命令,则必须按Enter键才能查看整个输出。使用JSch,我无法检索整个输出。 当我使用交互式终端登录时,命令输出在填充屏幕后停止并等待。 该代码取自 如何在String中获取jschshell命令输出: 问题答案: 通常,您不应使用“ shell”通道来自动执行命令。 “外壳”通道旨在实现交互式

  • APIService: 在活动调用API中:

  • 我正在使用Volley向API发出GET请求: 预期的JSON对象响应很大(可能高达500 KB)。我无法在日志中看到完整的响应。仅显示前50行左右。我还得到了info: BasicNetwork.log慢速请求:请求的HTTP响应= 这意味着请求需要超过3000毫秒。 尝试过的事情: 我已经在手机的开发者选项中将记录器缓冲区大小增加到1M。 原因可能是什么?当它很大的时候,响应是大块发送的吗?如

  • 我试图通过curl与新闻提供网站进行api集成。我能够检索数据,但它不是json格式,所以很难在我的门户网站上显示该数据。 下面是我使用的代码。 请找个人帮忙 curl.php 下面是我得到的结果,如果我回显从上述代码收到的响应 {“状态”:“好的”,“总计结果”: 36,“文章”:[{“来源”:{“id”: null,“名称”:“Tmz.com”},“作者”:“TMZ工作人员”,“标题”:“90