代码先锋网 代码片段及技术文章聚合

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

技术标签: Android  android  json

参考

封装JSON的数据是在服务器端进行封装了,Android更多的工作是解析(JSON对象/JSON数组),所以Android开发JSON数据的解析非常重要

JSON数据,是存储在文件里面:
格式1:

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

格式2:

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

格式3:

{
    "student":{
        "name":"李四",
        "age":99,
        "hobby":"爱好是练习截拳道",
        "dog":{
            "name":"阿黄",
            "age":77,
            "sex":"母"
        }
    }
}

格式4:(含有数组)

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

格式5:(含有数组)

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

为什么要使用jsonObject.optString, 不使用jsonObject.getString
因为jsonObject.optString获取null不会报错

看着JSON数据,一步一步的解析就好了,当明白JSON数据格式后,解析是非常容易的:

AnalyzeJSONActivity.java

package liudeli.mynetwork01;

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

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.InputStream;

public class AnalyzeJSONActivity extends Activity {

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

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

        setContentView(R.layout.activity_analyze_json);
    }

    /**
     * 解析JSON对象
     * {
     *     "name":"李四",
     *     "age":99,
     *     "hobby":"爱好是练习截拳道"
     * }
     * @param view
     */
    public void analyzeJSON1(View view) {

        String result =  readFile("pottingJSON1");
        // Log.d(TAG, "result:" + result);

        try{
           JSONObject jsonObject = new JSONObject(result);
            /**
             * 为什么要使用jsonObject.optString, 不使用jsonObject.getString
             * 因为jsonObject.optString获取null不会报错
             */
           String name = jsonObject.optString("name", null);
           int age = jsonObject.optInt("age", 0);
           String hobby = jsonObject.optString("hobby", null);

            // 日志打印结果:
           Log.d(TAG, "analyzeJSON1解析的结果:name:" + name + " age:" + age + " hobby:" + hobby);

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

    /**
     * 解析JSON对象-带Key
     * {
     *     "student":{
     *         "name":"李四",
     *         "age":99,
     *         "hobby":"爱好是练习截拳道"
     *     }
     * }
     * @param view
     */
    public void analyzeJSON2(View view) {
        String result =  readFile("pottingJSON2");
        // Log.d(TAG, "result:" + result);

        try{
            // 整个最大的JSON对象
            JSONObject jsonObjectALL = new JSONObject(result);
            /**
             * 为什么要使用jsonObject.optString, 不使用jsonObject.getString
             * 因为jsonObject.optString获取null不会报错
             */
            String student = jsonObjectALL.optString("student", null);

            if (!TextUtils.isEmpty(student)) {
                JSONObject jsonObject = new JSONObject(student);
                String name = jsonObject.optString("name", null);
                int age = jsonObject.optInt("age", 0);
                String hobby = jsonObject.optString("hobby", null);

                // 日志打印结果:
                Log.d(TAG, "analyzeJSON2解析的结果:name:" + name + " age:" + age + " hobby:" + hobby);
            }

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

    /**
     * 解析JSON对象-嵌套对象
     * {
     *     "student":{
     *         "name":"李四",
     *         "age":99,
     *         "hobby":"爱好是练习截拳道",
     *         "dog":{
     *             "name":"阿黄",
     *             "age":77,
     *             "sex":"母"
     *         }
     *     }
     * }
     * @param view
     */
    public void analyzeJSON3(View view) {
        String result =  readFile("pottingJSON3");
        // Log.d(TAG, "result:" + result);

        try{
            // 整个最大的JSON对象
            JSONObject jsonObjectALL = new JSONObject(result);
            /**
             * 为什么要使用jsonObject.optString, 不使用jsonObject.getString
             * 因为jsonObject.optString获取null不会报错
             */
            String student = jsonObjectALL.optString("student", null);

            if (!TextUtils.isEmpty(student)) {
                JSONObject jsonObject = new JSONObject(student);
                String name = jsonObject.optString("name", null);
                int age = jsonObject.optInt("age", 0);
                String hobby = jsonObject.optString("hobby", null);

                // 以下是dog JSON 对象相关的解析

                String dogStr = jsonObject.optString("dog", null);
                // 定义dog的JSON对象
                JSONObject dogJSONObject = new JSONObject(dogStr);
                String dogName = dogJSONObject.optString("name", null);
                int dogAge = dogJSONObject.optInt("age", 0);
                String dogSex = dogJSONObject.optString("sex", null);

                // 日志打印结果:
                Log.d(TAG, "analyzeJSON3解析的结果:name:" + name + " age:" + age + " hobby:" + hobby + "\n"
                                 + "dogName:" + dogName + " dogAge:" + dogAge + " dogSex:" + dogSex);
            }

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

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

        try{
            // 整个最大的JSON数组
            JSONArray jsonArray = new JSONArray(result);
            Log.d(TAG, "analyzeJSONArray1 jsonArray:" + jsonArray);
            // [{"name":"君君","age":89,"sex":"男"},{"name":"小君","age":99,"sex":"女"},{"name":"大君","age":88,"sex":"男"}]

            for (int i = 0; i < jsonArray.length(); i++) {
                // JSON数组里面的具体-JSON对象
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String name = jsonObject.optString("name", null);
                int age = jsonObject.optInt("age", 0);
                String sex = jsonObject.optString("sex", null);

                // 日志打印结果:
                Log.d(TAG, "analyzeJSONArray1 解析的结果:name" + name + " age:" + age + " sex:" + sex);
            }

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

    /**
     * 解析JSON数组-带Key
     * {
     *     "person":[
     *         {
     *             "name":"君君",
     *             "age":89,
     *             "sex":"男"
     *         },
     *         {
     *             "name":"小君",
     *             "age":99,
     *             "sex":"女"
     *         },
     *         {
     *             "name":"大君",
     *             "age":88,
     *             "sex":"男"
     *         }
     *     ]
     * }
     * @param view
     */
    public void analyzeJSONArray2(View view) {
        String result =  readFile("pottingJSONArray2");
        // Log.d(TAG, "result:" + result);

        try{
            /**
             * JSON数组在牛逼,一旦有了 key person 这样的标记,就必须先是个 JSON对象
             * 最外层的JSON对象,最大的哪个 { ... }
             */
            JSONObject jsonObjectALL = new JSONObject(result);

            // 通过标识(person),获取JSON数组
            JSONArray jsonArray = jsonObjectALL.getJSONArray("person");

            Log.d(TAG, "analyzeJSONArray1 jsonArray:" + jsonArray);
            // [{"name":"君君","age":89,"sex":"男"},{"name":"小君","age":99,"sex":"女"},{"name":"大君","age":88,"sex":"男"}]

            for (int i = 0; i < jsonArray.length(); i++) {
                // JSON数组里面的具体-JSON对象
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String name = jsonObject.optString("name", null);
                int age = jsonObject.optInt("age", 0);
                String sex = jsonObject.optString("sex", null);

                // 日志打印结果:
                Log.d(TAG, "analyzeJSONArray2 解析的结果:name" + name + " age:" + age + " sex:" + sex);
            }

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

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

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

            inputStream.close();

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

    /**
     * 定义一个Bean
     */
    /*class Student {
        private String name;
        private int age;
        private String hobby;

        public Student(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 + '\'' +
                    '}';
        }
    }*/
}

activity_analyze_json.xml

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="解析JSON对象"
            android:onClick="analyzeJSON1"
            android:layout_weight="1"
            />


        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="解析JSON对象-带Key"
            android:onClick="analyzeJSON2"
            android:layout_weight="1"
            />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="解析JSON对象-嵌套对象"
            android:onClick="analyzeJSON3"
            android:layout_weight="1"
            />


    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="解析JSON数组"
            android:onClick="analyzeJSONArray1"
            android:layout_weight="1"
            />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="解析JSON数组-带Key"
            android:onClick="analyzeJSONArray2"
            android:layout_weight="1"
            />

    </LinearLayout>

</LinearLayout>

所有解析JSON的Log打印:

analyzeJSON1

12-23 21:46:44.127 8204-8204/liudeli.mynetwork01 D/AnalyzeJSONActivity: analyzeJSON1解析的结果:name:李四 age:99 hobby:爱好是练习截拳道

analyzeJSON2

12-23 21:46:59.161 8204-8204/liudeli.mynetwork01 D/AnalyzeJSONActivity: analyzeJSON2解析的结果:name:李四 age:99 hobby:爱好是练习截拳道

analyzeJSON3

12-23 21:47:12.240 8204-8204/liudeli.mynetwork01 D/AnalyzeJSONActivity: analyzeJSON3解析的结果:name:李四 age:99 hobby:爱好是练习截拳道
dogName:阿黄 dogAge:77 dogSex:母

analyzeJSONArray1

12-23 21:47:35.108 8204-8204/liudeli.mynetwork01 D/AnalyzeJSONActivity: analyzeJSONArray1 解析的结果:name君君 age:89 sex:男
12-23 21:47:35.108 8204-8204/liudeli.mynetwork01 D/AnalyzeJSONActivity: analyzeJSONArray1 解析的结果:name小君 age:99 sex:女
12-23 21:47:35.108 8204-8204/liudeli.mynetwork01 D/AnalyzeJSONActivity: analyzeJSONArray1 解析的结果:name大君 age:88 sex:男

analyzeJSONArray2

12-23 21:47:55.457 8204-8204/liudeli.mynetwork01 D/AnalyzeJSONActivity: analyzeJSONArray2 解析的结果:name君君 age:89 sex:男
12-23 21:47:55.457 8204-8204/liudeli.mynetwork01 D/AnalyzeJSONActivity: analyzeJSONArray2 解析的结果:name小君 age:99 sex:女
12-23 21:47:55.457 8204-8204/liudeli.mynetwork01 D/AnalyzeJSONActivity: analyzeJSONArray2 解析的结果:name大君 age:88 sex:男

版权声明:本文为xuyin1204原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xuyin1204/article/details/108992776

智能推荐

ANDROID解析JSON数据

为什么80%的码农都做不了架构师?>>>    这一个环节可以说是卡的比较久的了。对于用惯了php那样的json解析方式的我,头一次使用JAVA的json解析方法,感到非常的头疼。 首先,服务端返回的数据格式如下: 从这个结构看,第一层是一个数组,数组里面包含的是2个JSON对象。 如果使用PHP则不必担心这些问题,函数会自动处理。但是JAVA不行。 所以,因...

Java解析JSON对象、JSON数组

一:利用alibaba.fastjson解析JSONObject、JSONArray 二:利用json.JSONObject解析JSONObject...

springboot解析json数组对象

1、post请求json数组对象 2、后台解析  ...

猜你喜欢

JSON解析数组或者对象

Json解析,同一个字段,获取的可能是对象,数组,或是null的解决: 比如 下面这个json字符串 characteristics 返回的是json对象 下面这个返回的是空数组 这时可以这样处理: 解释获取data对象数据,此步骤省略 //判断是否是JSONObject或者getJSONArray就行了...

android笔记--JSON数据解析

[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]   什么是JSON: JSON即JavaScript Object Natation, 它是一种轻量级的数据交换格式, 与XML一样, 是广泛被采用的客户端和服务端交互的解决方案. JSON对象: JSON中对象(Object)以"{"开始, 以"}"结束. 对象中的...

Android 解析 JSON 格式数据

一、前言 比起 XML,JSON 的主要优势在于它的体积更小,在网络上传输的时候可以更省流量。但缺点在于,它的语义性较差,看起来不如 XML 直观。 JSON 常用来表示对象和数组: 对象表示为键值对 数据由逗号分隔 花括号保存对象 方括号保存数组 解析 JSON 数据有多种方法,可以使用官方提供的 JSONObject,也可以使用 Google 的开源库 GSON。另外,一些第三方的开源库如 J...