使用AsyncTask从Python服务器检索JSON时返回“字符0处的输入结束”

2024-06-17 10:56:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我的任务有问题。基本上,我在做两个异步任务,按顺序执行,运行应用程序时总是出错。我使用一个flaskpython服务器通过API检索数据。我有两组对象需要以JSON格式从服务器获取。在服务器上的JSON中,我将根元素命名为我需要的集合的名称(rolesdevice_types),这两个集合本身都包含一个对象数组。当我在我的客户机JAVA(Android应用程序)中获取数据时,我检查根元素是否是必需的元素,并将它们放在相应对象的Arraylist中。问题是第二个请求返回了一个错误(注意:我将AsyncTask.execute请求放在onCreate中,因为在加载活动时,我将把作为适配器检索的json添加到一个Listview中

当我记录.d我的json响应时,我注意到它是不完整的。从服务器打印时,它是完整的

D/roles json: [
    {
        "roles": [
            {
                "name": "Anti-Spam",
                "slug": "anti-spam",
                "color": "f44336",
                "vm_role": false,
                "id": 23
            },
            {
                "name": "Backup",
                "slug": "backup",
                "color": "ffc107",
                "vm_role": true,
                "id": 13
            },
            {
                "name": "Blade Center",
                "slug": "blade-center",
                "color": "2f6a31",
                "vm_role": false,
                "id": 26
            },
            {
                "name": "Console Server - Mangement Server",
                "slug": "console-server-mangement-server",
                "color": "009688",
                "vm_role": false,
                "id": 1
            },
            {
                "name": "Deflecteur",
                "slug": "deflecteur",
                "color": "00bcd4",
                "vm_role": false,
                "id": 42
            },
            {
                "name": "Disk",
                "slug": "disk",
                "color": "aa1409",
                "vm_role": false,
                "id": 34
            },
            {
                "name": "DS3524 Battery",
                "slug": "ds3524-battery",
                "color": "aa1409",
                "vm_role": true,
                "id": 37
            },
            {
                "name": "DS3524 Controller",
                "slug": "ds3524-controller",
                "color": "ffeb3b",
                "vm_role": true,
                "id": 35
            },
            {
                "name": "DS3524 PowerFAN",
                "slug": "ds3524-powerfan",
                "color": "aa1409",
                "vm_role": true,
                "id": 36
            },
            {
                "name": "Equipements Tiers",
                "slug": "equipements-tiers",
                "color": "111111",
                "vm_role": true,
                "id": 28
            },
            {
                "name": "Firewall Client",
                "slug": "firewall-client",
                "color": "f44336",
                "vm_role": true,
                "id": 33
            },
            {
                "name": "Firewall OMT",
                "slug": "firewall-omt",
                "color": "f44336",
                "vm_role": true,
                "id": 6
            },
            {
                "name": "Media Gateway",
                "slug": "media-gateway",
                "color": "cddc39",
                "vm_role": true,
                "id": 11
            },
            {
                "name": "Mobile NSS - Data Gateway",
                "slug": "mobile-nss-data-gateway",
                "color": "3f51b5",
                "vm_role": true,
                "id": 47
            },
            {
                "name": "Mobile NSS - DSR",
                "slug": "mobile-nss-dsr",
                "color": "3f51b5",
                "vm_role": true,
                "id": 49
            },
            {
                "name": "Mobile NSS - Messaging",
                "slug": "mobile-nss-messaging",
                "color": "3f51b5",
                "vm_role": true,
                "id": 44
            },
            {
                "name": "Mobile NSS - Mobility Management",
                "slug": "mobile-nss-mobility-management",
                "color": "3f51b5",
                "vm_role": true,
                "id": 45
            },
            {
                "name": "Mobile NSS - OAM",
                "slug": "mobile-nss-oam",
                "color": "3f51b5",
                "vm_role": true,
                "id": 51
            },
            {
                "name": "Mobile NSS - OTA",
                "slug": "mobile-nss-ota",
                "color": "3f51b5",
                "vm_role": true,
                "id": 43
            },
            {
                "name": "Mobile NSS

运行Android Studio时出错

AsyncTask roles= new form.HTTPAsyncTask().execute("http://10.0.2.2:5000/get_role_id");

W/System.err: org.json.JSONException: End of input at character 0 of at org.json.JSONTokener.syntaxError(JSONTokener.java:449) at org.json.JSONTokener.nextValue(JSONTokener.java:97) at org.json.JSONArray.(JSONArray.java:92)

从python服务器打印的json

[{"roles": [{"name": "Anti-Spam", "slug": "anti-spam", "color": "f44336", "vm_role": false, "id": 23}, {"name": "Backup", "slug": "backup", "color": "ffc107", "vm_role": true, "id": 13}, {"name": "Blade Center", "slug": "blade-center", "color": "2f6a31", "vm_role": false, "id": 26}, {"name": "Console Server - Mangement Server", "slug": "console-server-mangement-server", "color": "009688", "vm_role": false, "id": 1}, {"name": "Deflecteur", "slug": "deflecteur",...

代码:

private String HttpPost(String myUrl) throws IOException, JSONException {
    String result = "";

    URL url = new URL(myUrl);

    // 1. create HttpURLConnection
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");

    // 2. build JSON object
    JSONObject jsonObject = buidJsonObject();

    // 3. add JSON content to POST request body
    setPostRequestContent(conn, jsonObject);

    // 4. make POST request to the given URL
    conn.connect();
    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"),8);
    StringBuilder sb = new StringBuilder();
    String output;
    while ((output = br.readLine()) != null) {
        sb.append(output);
    }



    return sb.toString();

}


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_form);
    all=new ArrayList<DeviceType>();
    listTypes=new ArrayList<DeviceType>();
    listRoles=new ArrayList<Roles>();
    if(checkNetworkConnection()){

       AsyncTask dtypes= new form.HTTPAsyncTask().execute("http://10.0.2.2:5000/get_dtypes");
       AsyncTask roles= new form.HTTPAsyncTask().execute("http://10.0.2.2:5000/get_role_id");

       }
    }
    else{
        Toast.makeText(this, "Not Connected!", Toast.LENGTH_SHORT).show();}


}




  private class HTTPAsyncTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {
        // params comes from the execute() call: params[0] is the url.
        try {
            try {
                return HttpPost(urls[0]);
            } catch (JSONException e) {
                e.printStackTrace();
                return "Error!";
            }
        } catch (IOException e) {
            return "Unabdgdsle to retrieve web page. URL may be invalid.";
        }
    }

    protected void onPostExecute(String result) {

        String N1=null;
        JSONObject obj=null;
        JSONArray temparr=null;
        JSONArray temparr2=null;
        JSONArray arr=null;


        try {

            arr = new JSONArray(result);




            if(arr.getJSONObject(0).optString("device_types")!=null){
                //System.out.println("types: "+arr.getJSONObject(0).optString("device_types"));
                temparr=new JSONArray(arr.getJSONObject(0).optString("device_types"));
                System.out.println("got device types");

                for(int i=0; i < temparr.length(); i++) {
                    //obj = arr.getJSONObject(i);

                    String m=temparr.getJSONObject(i).getString("manufacturer");
                    int mid=temparr.getJSONObject(i).getInt("manufacturerid");
                    String mod=temparr.getJSONObject(i).getString("model");
                    String pn=temparr.getJSONObject(i).getString("part_number");
                    int id=temparr.getJSONObject(i).getInt("id");
                    listTypes.add(new DeviceType(m,mid,mod,pn,id));

                    //arrTypes[i]= arr.getJSONObject(i);

                }
                System.out.println(listTypes.toString());
               System.out.println(listTypes.size());

            }

            if(arr.getJSONObject(0).optString("roles")!=null){
                //System.out.println("roles: "+arr.getJSONObject(0).optString("roles"));
                temparr2=new JSONArray(arr.getJSONObject(0).optString("roles"));
                System.out.println("got roles");

                for(int i=0; i < temparr2.length(); i++) {
                    //obj = arr.getJSONObject(i);

                    String c=temparr2.getJSONObject(i).getString("color");
                    int id=temparr2.getJSONObject(i).getInt("id");
                    String n=temparr2.getJSONObject(i).getString("name");
                    String s=temparr2.getJSONObject(i).getString("slug");

                    listRoles.add(new Roles(c,id,n,s));


                    //arrTypes[i]= arr.getJSONObject(i);

                }
                System.out.println(listRoles.toString());
                System.out.println(listRoles.size());
            }



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


private JSONObject buidJsonObject() throws JSONException {

    JSONObject jsonObject = new JSONObject();
    jsonObject.accumulate("token", "1");

    return jsonObject;
}

private void setPostRequestContent(HttpURLConnection conn,
                                   JSONObject jsonObject) throws IOException {

    OutputStream os = conn.getOutputStream();
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
    writer.write(jsonObject.toString());
    Log.i(login.class.toString(), jsonObject.toString());
    writer.flush();
    writer.close();
    os.close();
}

Tags: nameidjsonfalsetruenewstringvm
1条回答
网友
1楼 · 发布于 2024-06-17 10:56:35

你可能会得到一个空白的回答。它不为null,但响应为空。所以你得到的是这个错误,而不是一个NPE异常

编辑: 我看到您正在使用一个名为HttpPost的方法,并且假设它在URL上使用方法“POST”,您应该使用“GET”而不是“POST”

相关问题 更多 >