我的应用从Google Cloud Endpoint后端获取数据,此数据采用json格式。当我在ListView中查看此数据时,这就是我得到的:
这是预期的,因为我没有做过任何形式的解析或转换。 我的目标输出是:
我搜索并搜索了一种没有运气的方法。 One example使用了一种不同的方法,IMO对于我认为不应该超过5行代码的东西来说太复杂了。Another从文件中读取数据,其他几个也是如此。
这是来自AsyncTask的调用端点的地方:
@Override
protected void onPostExecute(List<Student> result) {
ArrayAdapter<Student> arrayAdapter = new ArrayAdapter<Student>(getApplicationContext(), R.layout.row_text, result);
studentListView.setAdapter(new ArrayAdapter<Student>(getApplicationContext(), R.layout.activity_endpoint_launcher, result));
studentListView.setAdapter(arrayAdapter);
}
我尝试添加这个:
String jsString = result.toString();
try {
JSONObject jsonObject = new JSONObject(jsString);
String name = jsonObject.getString(TAG_NAME);
Log.d("EndpointLauncher", name);
} catch (JSONException e) {
e.printStackTrace();
}
但是我收到错误(虽然不会导致应用程序崩溃):
W/System.err﹕ org.json.JSONException: Value [{"grade":50,"matriculationNumber":"453","name":"Vera Brown"},{"grade":90,"matriculationNumber":"123456","name":"Sam Sung"},{"grade":90,"matriculationNumber":"654321","name":"To Shiba"},{"grade":90,"matriculationNumber":"876123","name":"Ann Droid"}] of type org.json.JSONArray cannot be converted to JSONObject
非常感谢任何帮助。
答案 0 :(得分:1)
问题是它返回一个jsonarray并且你将它转换为一个对象,试试这个
JSONArray arr = new JSONArray(jsString);
然后你可以做
arr.getJSONObject(0).getString(TAG_NAME);
您可以在其中循环遍历json数组中的每个元素并将其放入新类
List<Student> students = new ArrayList<Student>();
for(int i =0; i < arr.length(); i ++)
{
JSONObject jObject = arr.getJSONObject(i);
Student newS = new Student();
newS.name = jObject.getString("name");
etc...
students.add(newS);
}
答案 1 :(得分:0)
所以我终于找到了解决这个问题的方法。首先,我需要在我的主项目包(app)
中创建一个新的Student类,并将我从后端获得的值存储在此类的对象中,并且不是来自后端包。
最后,这就是我得到的(
public class EndpointAsyncTask extends AsyncTask(...) {
....
@Override
protected void onPostExecute(List<Student> result) {
String jsString = result.toString();
studentList = new ArrayList<NewStudentClass>();
Student students;
try {
JSONArray jsonArray = new JSONArray(jsString);
for (int i = 0; i < jsonArray.length(); i++) {
students = result.get(i);
String name = students.getName();
int grade = students.getGrade();
long matricNumber = students.getMatriculationNumber();
NewStudentClass st = new NewStudentClass();
st.setMatriculationNumber(matricNumber);
st.setGrade(grade);
st.setName(name);
studentList.add(st);
}
} catch (JSONException e) {
e.printStackTrace();
}
ArrayAdapter<NewStudentClass> arrayAdapter = new ArrayAdapter<NewStudentClass>(getApplicationContext(), R.layout.row_text, studentList);
studentListView.setAdapter(new ArrayAdapter<NewStudentClass>(getApplicationContext(), R.layout.activity_endpoint_launcher, studentList));
studentListView.setAdapter(arrayAdapter);
}
}
当从ListView的NewStudentClass
实例调用toString()方法时,我得到了我想要的输出。