无法解析json - 字符串不能转换为JSONArray
问题描述:
我试图从https://jsonplaceholder.typicode.com/users解析json时遇到问题,在String中获取json响应并移入JSONArray,然后解析它。但是,它说java.lang.String不能转换为JSONArray。无法解析json - 字符串不能转换为JSONArray
我得到json响应的代码是在doInBackground()中,解析了onPostExecute()中的json。
这里是我的解析代码:
public class HomeActivity extends AppCompatActivity {
public static final int CONNECTION_TIMEOUT = 10000;
public static final int READ_TIMEOUT = 15000;
private RecyclerView rv_user;
private AdapterUser mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
new AsyncFetch().execute();
}
private class AsyncFetch extends AsyncTask<String, String, String> {
String response = "";
ProgressDialog pdLoading = new ProgressDialog(HomeActivity.this);
HttpURLConnection conn;
URL url = null;
@Override
protected void onPreExecute() {
super.onPreExecute();
pdLoading.setMessage("\tLoading...");
pdLoading.setCancelable(false);
pdLoading.show();
}
@Override
protected String doInBackground(String... params) {
try {
url = new URL("https://jsonplaceholder.typicode.com/users");
} catch (MalformedURLException e) {
e.printStackTrace();
return e.toString();
}
try {
conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(READ_TIMEOUT);
conn.setConnectTimeout(CONNECTION_TIMEOUT);
conn.setRequestMethod("GET");
conn.setDoOutput(true);
} catch (IOException e1) {
e1.printStackTrace();
return e1.toString();
}
try {
int response_code = conn.getResponseCode();
if (response_code == HttpURLConnection.HTTP_OK) {
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
response = sb.toString();
// Pass data to onPostExecute method
System.out.println(response);
return (response);
} else {
return ("unsuccessful");
}
} catch (IOException e) {
e.printStackTrace();
return e.toString();
} finally {
conn.disconnect();
}
}
@Override
protected void onPostExecute(String result) {
pdLoading.dismiss();
List<DataUser> data = new ArrayList<>();
pdLoading.dismiss();
try {
JSONArray jArray = new JSONArray(result);
// Extract data from json and store into ArrayList as class objects
for(int i=0;i<jArray.length();i++){
JSONObject json_user_data = jArray.getJSONObject(i);
DataUser userData = new DataUser();
userData.id = json_user_data.getString("id");
userData.fullName = json_user_data.getString("name");
userData.uName = json_user_data.getString("username");
userData.email = json_user_data.getString("email");
JSONObject addr = json_user_data.getJSONObject("address");
String street = addr.getString("street");
String city = addr.getString("city");
int zip = addr.getInt("zipcode");
userData.address = street+", "+ city + " " + zip;
userData.phone = json_user_data.getString("phone");
userData.web = json_user_data.getString("website");
data.add(userData);
}
// Setup and Handover data to recyclerview
rv_user = (RecyclerView)findViewById(R.id.userList);
mAdapter = new AdapterUser(HomeActivity.this, data);
rv_user.setAdapter(mAdapter);
rv_user.setLayoutManager(new LinearLayoutManager(HomeActivity.this));
} catch (JSONException e) {
Toast.makeText(HomeActivity.this, e.toString(), Toast.LENGTH_LONG).show();
}
}
}
}
帮助我,请。谢谢。
答
变化两个字符串在代码:
conn.setDoOutput(false);
你要阅读从服务器,写不出来。在你的JSON
String zip = addr.getString("zipcode");
邮编有59590-4157形式,因此不能被解读为INT。
+0
它的工作原理!感谢你们对我的帮助。 – newITguy
答
你看过网址中“结果”的内容吗?我想这不是你想要的。
请指出它失败的地方,并删除不必要的代码 –
我很抱歉。编辑我的问题。 – newITguy