У меня проблема с моими AsyncTasks. По сути, я выполняю две AsyncTasks, выполняемые последовательно, и у меня всегда возникают ошибки при запуске приложения. Я использую сервер Flask Python для получения данных с помощью API. У меня есть 2 набора объектов, которые мне нужно получить с сервера в формате JSON. В моем JSON на сервере я называю корневой элемент именем нужного мне набора (roles и device_types), оба из которых содержат массив объектов. Когда я получаю данные в своем клиентском JAVA (приложении для Android), я проверяю, является ли корневой элемент необходимым элементом, и помещаю их в Arraylist соответствующих ему объектов. Проблема в том, что второй запрос возвращает ошибку. (Примечание: я разместил свои запросы AsyncTask.execute в onCreate, потому что при загрузке активности я добавлю json, полученный как адаптер, в Listview).
когда я регистрирую свой ответ 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)
JSON, напечатанный с сервера Python Flask
[{"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();
}
POST вы заполняете JSON .. Кажется, проблема с JSON
Я только что заметил, что когда я регистрирую свой JSON, он не является полным, это нормально?




проверьте JSON, эта ошибка возникает из-за JSON