说说在 Android 中如何解析 JSON

作者: deniro | 来源:发表于2018-06-16 10:38 被阅读150次

JSON 的相对 XML 来说,语义性较差,但它的体积更小,所以在传输时更省流量。

假设在 HTTP 服务器中返回以下内容的 JSON 格式数据:

[
    {
        "fengxiang": "南风",
        "fengli": "3-4级",
        "high": "高温 32℃",
        "type": "多云",
        "low": "低温 17℃",
        "date": "16日星期二"
    },
    {
        "fengxiang": "南风",
        "fengli": "微风级",
        "high": "高温 34℃",
        "type": "晴",
        "low": "低温 19℃",
        "date": "17日星期三"
    },
    {
        "fengxiang": "南风",
        "fengli": "微风级",
        "high": "高温 35℃",
        "type": "晴",
        "low": "低温 22℃",
        "date": "18日星期四"
    },
    {
        "fengxiang": "南风",
        "fengli": "微风级",
        "high": "高温 35℃",
        "type": "多云",
        "low": "低温 22℃",
        "date": "19日星期五"
    },
    {
        "fengxiang": "南风",
        "fengli": "3-4级",
        "high": "高温 34℃",
        "type": "晴",
        "low": "低温 21℃",
        "date": "20日星期六"
    }
]

1 JSONObject 解析

JSONObject 是官方提供的 JSON 工具包,我们来看一看如何解析上述的 JSON 数据。

/**
 * 请求 JSON 数据
 */
private void requestJSON() {
    OkHttpClient client = new OkHttpClient();
    String url = "http://10.0.2.2/data.json";
    Request request = new Request.Builder().url(url).build();
    try {
        Response response = client.newCall(request).execute();//发送请求
        String result = response.body().string();
        Log.d(TAG, "result: " + result);
        parseJSONWithJSONObject(result);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

/**
 * 使用 JSONObject 解析 JSON
 *
 * @param result
 */
private void parseJSONWithJSONObject(String result) {
    try {
        JSONArray jsonArray = new JSONArray(result);
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject object = jsonArray.getJSONObject(i);
            String date = object.getString("date");//日期
            String weather = object.getString("type");//天气
            Log.d(TAG, "日期: " + date);
            Log.d(TAG, "天气: " + weather);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

因为返回的数据是一个数组,所以我们直接传入 JSONArray,然后遍历它得到 JSONObject 对象,然后就可以根据名称获取数据啦。

输出结果:

D/MainActivity: 日期: 16日星期二
D/MainActivity: 天气: 多云
D/MainActivity: 日期: 17日星期三
D/MainActivity: 天气: 晴
D/MainActivity: 日期: 18日星期四
D/MainActivity: 天气: 晴
D/MainActivity: 日期: 19日星期五
D/MainActivity: 天气: 多云
D/MainActivity: 日期: 20日星期六
D/MainActivity: 天气: 晴

2 GSON 解析

GSON 库会自动的把 JSON 字符串映射为一个对象。

简单对象直接传入 Gson#fromJson(String json, Class<T> classOfT) 的 classOfT 即可,复杂对象可以借助 TypeToken 获取 Type 后再传入 Gson#fromJson(String json, Type typeOfT)

添加 GSON 库依赖:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    testCompile 'junit:junit:4.12'
    //网络通信库
    compile "com.squareup.okhttp3:okhttp:3.10.0"
    //JSON 库
    compile "com.google.code.gson:gson:2.8.5"
}

活动类代码:

/**
 * 请求 JSON 数据
 */
private void requestJSON() {
    OkHttpClient client = new OkHttpClient();
    String url = "http://10.0.2.2/data.json";
    Request request = new Request.Builder().url(url).build();
    try {
        Response response = client.newCall(request).execute();//发送请求
        String result = response.body().string();
        Log.d(TAG, "result: " + result);
        parseJSONWithGSON(result);
//            parseJSONWithJSONObject(result);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

/**
 * 使用 GSON 解析 JSON
 *
 * @param result
 */
private void parseJSONWithGSON(String result) {
    Log.d(TAG, "使用 GSON 解析 JSON------- ");
    Gson gson = new Gson();
    List<Weather> list = gson.fromJson(result, new TypeToken<List<Weather>>() {
    }.getType());
    for (Weather weather : list) {
        Log.d(TAG, "日期: " + weather.getDate());
        Log.d(TAG, "天气: " + weather.getType());
    }
}

解析结果与 JSONObject 的解析相同,但是使用更简单啦O(∩_∩)O哈哈~

相关文章

  • 说说在 Android 中如何解析 JSON

    JSON 的相对 XML 来说,语义性较差,但它的体积更小,所以在传输时更省流量。 假设在 HTTP 服务器中返回...

  • @SerializedName注解

    在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。G...

  • 说说在 Android 中如何解析 XML

    网络上传输数据有两种格式:XML 与 JSON。JSON 暂且按下不表,我们先说说如何解析 XML。 1 搭建 ...

  • 菜鸟学习之Android中pull解析xml原理

    我们在开发Android app的时候,常常用到对数据进行解析,最常用的就是对xml,与json解析。json基本...

  • python库json快速入门

    在本教程中,您将学习如何借助示例在Python中解析,读取和编写JSON。 此外,您将学习将JSON转换为dict...

  • Android 中解析 JSON

    JSON JSON( JavaScript Object Notation ) 是一种轻量级的数据交换格式。易于阅...

  • Json海量数据解析

    Json海量数据解析 前言 ​ 在android开发中,app和服务器进行数据传输时大多数会用到json。在解...

  • Android中Gson解析json数据使用@Serialize

    笔记 在Android中使用Gson来解析json数据十分方便,可以直接将json数据解析成java对象或者集合。...

  • Android万能解析Json(一)

    Android万能解析并获取Json数据,所有Json结构一个解决 想要解析Json数据,首先要了解Json数据的...

  • Gson序列化那些事

    Android开发中会经常解析json,使用retrofit框架常用gson解析json。Gson有一定的容错机制...

网友评论

    本文标题:说说在 Android 中如何解析 JSON

    本文链接:https://www.haomeiwen.com/subject/xinveftx.html