www.91084.com

GVKun编程网logo

如何在Android中使用Java和org.json迭代这个JSON数组?(android json)

22

最近很多小伙伴都在问如何在Android中使用Java和org.json迭代这个JSON数组?和androidjson这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Android

最近很多小伙伴都在问如何在Android中使用Java和org.json迭代这个JSON数组?android json这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Android / Java中的JSON数组迭代、android – 如何从这个json对象中提取字符串数组?、android – 如何使用JSON对象传递JSON数组、Android-Gson解析JSON数据(JSON对象/JSON数组)等相关知识,下面开始了哦!

本文目录一览:

如何在Android中使用Java和org.json迭代这个JSON数组?(android json)

如何在Android中使用Java和org.json迭代这个JSON数组?(android json)

我的JSON字符串看起来像这样(包含在一个名为sJSON的字符串变量中):

[
    {"id":284}
],
[
    {"name":John,"surname":Doe},
    {"name":Jane,"surname":Doe}
]

我能够像这样解析第一个数组(使用Java并导入org.json):

JSONArray arrjson = new JSONArray(sJSON);
JSONObject jsonGeneralData = new JSONObject(arrjson.get(0).toString());

String sResult = jsonGeneralData.get("id").toString();

返回预期的结果,即284.我正在努力获得第二个项目数组,并迭代它们.我不确定我的JSON字符串是否格式错误,或者我是否试图以错误的方式访问它.这是我试过的:

JSONObject jsonPersonData = new JSONObject(arrjson.get(1).toString());

这是我得到的,我无法弄清楚如何循环第二个数组内的单个项目.

编辑:

看来这行只解析方括号中的第一个字符串:

JSONArray arrjson = new JSONArray(sJSON);

JSON是错误的(与上面相同的例子),还是它没有正确解析它?我已经设法通过对字符串进行拆分并将它们分别放在自己的JSONArray中来解决问题,但我认为这不是最好的做事方式.

解决方法:

你想要这样的东西..

JSONArray jsonArray = new JSONArray(sJSON);
JSONArray jsonPersonData = jsonArray.getJSONArray(1);
for (int i=0; i<jsonPersonData.length(); i++) {
    JSONObject item = jsonPersonData.getJSONObject(i);
    String name = item.getString("name");
    String surname = item.getString("surname");
}

Android / Java中的JSON数组迭代

Android / Java中的JSON数组迭代

我正在构建一个需要下载并与在线数据库同步的android应用,我将查询从该应用发送到php页面,该页面以JSON格式返回数据库中的相关行。

有人可以告诉我迭代JSON数组的最佳方法吗?

我收到一个对象数组:

[{json object},{json object},{json object}]

我可以用来访问数组中的JSONObjects的最简单的代码是什么?

编辑:现在,我想到它,我用来迭代循环的方法是:

for (String row: json){     id = row.getInt("id");     name = row.getString("name");     password = row.getString("password");}

所以我想我已经能够以某种方式将返回的Json变成可迭代的数组。有什么想法可以实现这一目标吗?

我为自己的冒昧表示歉意,但我是通过网上发现的一个示例进行此操作的,此后一直找不到。

答案1

小编典典

我已经用两种不同的方式做到了

1.) make a Map

        HashMap<String, String> applicationSettings = new HashMap<String,String>();        for(int i=0; i<settings.length(); i++){            String value = settings.getJSONObject(i).getString("value");            String name = settings.getJSONObject(i).getString("name");            applicationSettings.put(name, value);        }

2.) make a JSONArray of names

    JSONArray names = json.names();    JSONArray values = json.toJSONArray(names);    for(int i=0; i<values.length(); i++){        if (names.getString(i).equals("description")){            setDescription(values.getString(i));        }        else if (names.getString(i).equals("expiryDate")){            String dateString = values.getString(i);            setExpiryDate(stringToDateHelper(dateString));         }        else if (names.getString(i).equals("id")){            setId(values.getLong(i));        }        else if (names.getString(i).equals("offerCode")){            setOfferCode(values.getString(i));        }        else if (names.getString(i).equals("startDate")){            String dateString = values.getString(i);            setStartDate(stringToDateHelper(dateString));        }        else if (names.getString(i).equals("title")){            setTitle(values.getString(i));        }    }

android – 如何从这个json对象中提取字符串数组?

android – 如何从这个json对象中提取字符串数组?

我正在尝试使用org.json中的类从以下json对象获取可用数字列表

    {
        "response":true,
        "state":1,
        "data":
        {
            "CALLERID":"81101099",
            "numbers":
                [
                       "21344111","21772917",
                       "28511113","29274472",
                       "29843999","29845591",
                       "30870001","30870089",
                       "30870090","30870091"
                ]
        }
    }

在从Web服务接收到json对象后,我的第一步是:

jsonObj = new JSONObject(response);
jsonData = jsonObj.optJSONObject("data");

现在,如何保存数字的字符串数组?

解决方法:

采用:

jsonObj = new JSONObject(response);
jsonData = jsonObj.optJSONObject("data");
JSONArray arrjson = jsonData.getJSONArray("numbers");
String[] arr = new String[arrjson.length()];
for(int i = 0; i < arrjson.length(); i++)
    arr[i] = arrjson.getString(i);

android – 如何使用JSON对象传递JSON数组

android – 如何使用JSON对象传递JSON数组

GridView包含类别,当我点击任何GridView项目(即 – 任何类别)时,我想仅在ViewPager中显示那些属于该特定类别的项目.

例如,我首先有两个类别 – 电子设备和第二个设备 – 仍然每当我点击设备类别时 – 它显示所有项目(从电子设备1到设备2),而它必须仅显示设备类别下的项目

问题

仍然显示ViewPager中的所有项目,无论用户点击了哪个类别….我怎样才能显示属于tapped类别的那些项目?

public class MainActivity extends Activity {

    ArrayList<Items> itemsArrayList;
    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        itemsArrayList = new ArrayList<Items>();

        ...

        gridView.setonItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0,View arg1,int position,long id) {

                String categoryName = menusArrayList.get(position).getName().toString();
                Log.d("categoryName:",categoryName);                   

                menus = menusArrayList.get(position);                               
                itemsArrayList = menus.getItemsArrayList();     

                adapter = new ViewPagerAdapter(MenusActivity.this,R.layout.adapter_viewpager,itemsArrayList);

                viewPager.setAdapter(adapter);
            }
        });
    }


    class JSONAsyncTask extends AsyncTask<String,Void,Boolean> {

        ProgressDialog dialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

        }

        @Override
        protected Boolean doInBackground(String... urls) {
            try {

                .....

                    JSONArray jsonArray = jsonObject.getJSONArray("category");

                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject jObject = jsonArray.getJSONObject(i);

                        menus = new Menus();

                        menus.setName(jObject.getString("name"));                       
                        menus.setimage(jObject.getString("image"));

                        JSONArray imagesArray = jObject.getJSONArray("items");                      

                        for(int j=0; j<imagesArray.length(); j++)
                        {
                            JSONObject imagesObject = imagesArray.getJSONObject(j);

                            items = new Items();
                            items.setTitle(imagesObject.getString("title"));
                            items.setimage(imagesObject.getString("image"));                                

                            itemsArrayList.add(items);
                        }       

                        menus.setItemsArrayList(itemsArrayList);                        
                        menusArrayList.add(menus);
                    }
                    return true;
                }
                ...
            return false;
        }

        protected void onPostExecute(Boolean result) {
            dialog.cancel();
            ...

        }
    }

}

解决方法

您的itemArrayList是全局的,并且在解析时,每次读取类别时都会将项目添加到该列表中.因此,您的itemListArray包含所有项目.由于在将项目添加到列表时引用了列表,因此您还要将项目添加到以前的类别,因为它们引用了相同的列表.尝试像这样改变你的内循环.

ArrayList<Items> itemsArrayList = new ArrayList<Items>();    
for(int j=0; j<imagesArray.length(); j++)
                        {
                        JSONObject imagesObject = imagesArray.getJSONObject(j);

                    items = new Items();
                    items.setTitle(imagesObject.getString("title"));
                    items.setimage(imagesObject.getString("image"));                                

                    itemsArrayList.add(items);
                }

Android-Gson解析JSON数据(JSON对象/JSON数组)

Android-Gson解析JSON数据(JSON对象/JSON数组)

上一篇博客,Android-解析JSON数据(JSON对象/JSON数组),介绍了使用 org.json.JSONArray;/org.json.JSONObject; 来解析JSON数据;

 

Google Android 还提供来另外一种方式来解析JSON数据,那就是Gson;

Gson是非常方便的JSON解析/封装/处理等等,强大的工具类:

  特点:Gson可以把JSON对象数据->转换映射为Bean对象

       Gson可以把JSON数组数据->转换映射为集合

     Gson可以把Bean对象->转换为JSON对象数据

     Gson可以把集合->转换为JSON数组数据

        ........... 

 

首先要在app/build.gradle配置文件中,导入,Gson支持包

// Gson支持包的导入
implementation ''com.google.code.gson:gson:2.6.2''

 


 

需要解析的JSON数据:

/data/data/liudeli.mynetwork01/files/pottingJSON1

{
    "name":"李四",
    "age":99,
    "hobby":"爱好是练习截拳道"
}

 

/data/data/liudeli.mynetwork01/files/pottingJSONArray1

[
    {
        "name":"君君",
        "age":89,
        "sex":"男"
    },
    {
        "name":"小君",
        "age":99,
        "sex":"女"
    },
    {
        "name":"大君",
        "age":88,
        "sex":"男"
    }
]

 

定义一个Bean
定义的name/age/hobby 必须要和JSON数据里面的一模一样 

package liudeli.mynetwork01.entity;

/**
 * 定义一个Bean
 * 定义的name/age/hobby 必须要和JSON数据里面的一模一样
 * {
 *     "name":"李四",
 *     "age":99,
 *     "hobby":"爱好是练习截拳道"
 * }
 */
public class Student2 {

    private String name;
    private int age;
    private String hobby;

    public Student2(String name, int age, String hobby) {
        this.name = name;
        this.age = age;
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name=''" + name + ''\'''' +
                ", age=" + age +
                ", hobby=''" + hobby + ''\'''' +
                ''}'';
    }
}

  

定义的name/age/sex 必须要和JSON数据里面的一模一样

package liudeli.mynetwork01.entity;

/**
 * 定义一个Bean
 * 定义的name/age/sex 必须要和JSON数据里面的一模一样
 *
 * [
 *     {
 *         "name":"君君",
 *         "age":89,
 *         "sex":"男"
 *     },
 *     {
 *         "name":"小君",
 *         "age":99,
 *         "sex":"女"
 *     },
 *     {
 *         "name":"大君",
 *         "age":88,
 *         "sex":"男"
 *     }
 * ]
 */
public class Student {

    private String name;
    private int age;
    private String sex;

    public Student(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name=''" + name + ''\'''' +
                ", age=" + age +
                ", sex=''" + sex + ''\'''' +
                ''}'';
    }
}

 

GsonAnalyzeJSONActivity.java

package liudeli.mynetwork01;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.List;

import liudeli.mynetwork01.entity.Student;
import liudeli.mynetwork01.entity.Student2;

public class GsonAnalyzeJSONActivity extends Activity {

    private final String TAG = GsonAnalyzeJSONActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_gson_analyze);
    }

    /**
     * Gson解析JSON对象
     * {
     *     "name":"李四",
     *     "age":99,
     *     "hobby":"爱好是练习截拳道"
     * }
     */
    public void gonsAnalyzeJSONObject(View view) {
       String jsonData = readFile("pottingJSON1");
       // Log.d(TAG, "jsonData:" + jsonData);

       Gson gson = new Gson();
       Student2 student2 = gson.fromJson(jsonData, Student2.class);
       Log.d(TAG, "gonsAnalyzeJSONObject 解析后的结果:" + student2.toString());
    }

    /**
     * Gson解析JSON数组
     * [
     *     {
     *         "name":"君君",
     *         "age":89,
     *         "sex":"男"
     *     },
     *     {
     *         "name":"小君",
     *         "age":99,
     *         "sex":"女"
     *     },
     *     {
     *         "name":"大君",
     *         "age":88,
     *         "sex":"男"
     *     }
     * ]
     * @param view
     */
    public void gonsAnalyzeJSONArray(View view) {
        String jsonData = readFile("pottingJSONArray1");
        // Log.d(TAG, "jsonData:" + jsonData);

        Gson gson = new Gson();

        /**
         * TypeToken<List<需要映射的Bean对象>>(){}.getType()
         */
        List<Student> list = gson.fromJson(jsonData, new TypeToken<List<Student>>(){}.getType()); // 参数二:需要指定类型,类型来决定解析的集合

        for (Student student: list) {
            Log.d(TAG, "gonsAnalyzeJSONArray 解析后的结果:" + student.toString());
        }

    }

    /**
     * 读取文件里面的字符串
     * @param fileName
     * @return
     */
    private String readFile(String fileName) {
        String result = null;
        try {
            InputStream inputStream = openFileInput(fileName);

            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            byte[] bytes = new byte[inputStream.available()];

            inputStream.read(bytes);

            baos.write(bytes, 0,bytes.length);

            result = new String(baos.toByteArray());

            baos.close();
            inputStream.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

 

activity_gson_analyze.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Gson解析JSON对象"
        android:onClick="gonsAnalyzeJSONObject"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Gson解析JSON数组"
        android:onClick="gonsAnalyzeJSONArray"
        />

</LinearLayout>

 

日志的打印:

使用Gson解析,JSON对象数据:

12-23 23:00:52.108 9729-9729/liudeli.mynetwork01 D/GsonAnalyzeJSONActivity: gonsAnalyzeJSONObject 解析后的结果:Student{name=''李四'', age=99, hobby=''爱好是练习截拳道''}

 

使用Gson解析,JSON数组数据:

12-23 23:00:53.199 9729-9729/liudeli.mynetwork01 D/GsonAnalyzeJSONActivity: gonsAnalyzeJSONArray 解析后的结果:Student{name=''君君'', age=89, sex=''男''}
12-23 23:00:53.199 9729-9729/liudeli.mynetwork01 D/GsonAnalyzeJSONActivity: gonsAnalyzeJSONArray 解析后的结果:Student{name=''小君'', age=99, sex=''女''}
12-23 23:00:53.199 9729-9729/liudeli.mynetwork01 D/GsonAnalyzeJSONActivity: gonsAnalyzeJSONArray 解析后的结果:Student{name=''大君'', age=88, sex=''男''}

 

今天的关于如何在Android中使用Java和org.json迭代这个JSON数组?android json的分享已经结束,谢谢您的关注,如果想了解更多关于Android / Java中的JSON数组迭代、android – 如何从这个json对象中提取字符串数组?、android – 如何使用JSON对象传递JSON数组、Android-Gson解析JSON数据(JSON对象/JSON数组)的相关知识,请在本站进行查询。

本文标签: