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