繁体   English   中英

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

[英]Convert/parse data in json format to java in Android

我的应用程序从Google Cloud Endpoint后端获取数据,并且此数据为json格式。当我在ListView中查看此数据时,得到的是:

在此处输入图片说明

这是可以预期的,因为我还没有进行任何形式的解析或转换。 我的目标输出是这样的:

在此处输入图片说明

我一直在寻找并寻找一种没有运气的方法。 一个示例使用了另一种方法,对于某些我认为不应使用超过5行代码的事情,IMO太复杂了。 另一个从文件读取数据,其他几个也从文件读取数据。

这是从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

任何帮助将不胜感激。

问题是它返回的是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);
}

因此,我终于找到了解决方法。首先,我需要在主项目包(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()方法时,我得到了想要的输出。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM