将json格式的数据转换/解析为Android中的java

时间:2015-04-23 16:35:36

标签: java android json

我的应用从Google Cloud Endpoint后端获取数据,此数据采用json格式。当我在ListView中查看此数据时,这就是我得到的:

enter image description here

这是预期的,因为我没有做过任何形式的解析或转换。 我的目标输出是:

enter image description here

我搜索并搜索了一种没有运气的方法。 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

非常感谢任何帮助。

2 个答案:

答案 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()方法时,我得到了我想要的输出。

enter image description here