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 哈哈~
来源: http://www.jianshu.com/p/703315566ded