java - 从 Python 服务器使用 AsyncTask 进行 JSON 检索正在返回“字符 0 处的输入结束”
问题描述
我的 AsyncTasks 有问题。基本上,我正在按顺序执行两个 AsyncTask,并且在运行应用程序时总是出错。我正在使用 Flask Python 服务器通过 API 检索数据。我有 2 组需要从服务器获取 JSON 格式的对象。在服务器上的 JSON 中,我将根元素命名为我需要的集合的名称(roles
和device_types
),它们都包含一个对象数组。当我在客户端 JAVA(Android 应用程序)中获取数据时,我会检查根元素是否是必需的元素,并将它们放在相应对象的 Arraylist 中。问题是第二个请求返回错误。(注意:我将 AsyncTask.execute 请求放在 onCreate 中,因为在加载活动时,我会将作为适配器检索到的 json 添加到 Listview)。
当我 log.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: 在 org.json.JSONTokener.syntaxError(JSONTokener.java:449) 处 org.json.JSONTokener.nextValue(JSONTokener.java:97) 处的字符 0 处输入结束org.json.JSONArray.(JSONArray.java:92)
从 Flask python 服务器打印的 json
[{“角色”:[{“名称”:“反垃圾邮件”,“slug”:“反垃圾邮件”,“颜色”:“f44336”,“vm_role”:假,“id”:23},{ “名称”:“备份”,“slug”:“备份”,“颜色”:“ffc107”,“vm_role”:true,“id”:13},{“名称”:“刀片中心”,“slug” :“刀片中心”,“颜色”:“2f6a31”,“vm_role”:false,“id”:26},{“名称”:“控制台服务器 - 管理服务器”,“slug”:“控制台服务器 -管理服务器”,“颜色”:“009688”,“vm_role”:假,“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();
}
解决方案
推荐阅读
- rust-cargo - 节点模板构建错误
- firefox - WebRTC:Firefox 经常选择最差的 ICE 候选者?
- javascript - 如何在预期的动画之前停止 css 旋转回面对面?
- java - 如何从可能是与给定 id 匹配的父级或子级之一的列表中获取对象
- f# - 反馈 F# 成语和风格,做什么;; 意思等
- r - 堆叠数据集
- javascript - 收到承诺{
错误节点 - excel - Excel VBA IE 自动化 - VBA 在 Window.confirm 弹出后停止
- python - 如何使用数组找到前 n 个负整数
- css - 如何阻止 flex 行的第二行出现在页面中间?