Android开发经验谈Android开发程序员

说说在 Android 中如何解析 JSON

2018-06-16  本文已影响150人  deniro

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哈哈~

上一篇下一篇

猜你喜欢

热点阅读