Json解析专题
Json是一种使用在网络中,作为服务器传递到客户端的一种特殊字符串,本文收集了工作中常见的几种Json数据类型以及其的解析方式(谷歌框架及自定义的框架):
常见Json数据类型-对象型
{"name":"Jared.Bai","age":18,"sex":"male"}
常见Json数据类型-数组型
[{"name":"Jared.Bai","age":18,"sex":"male"},
{"name":"Amy.Lu","age":18,"sex":"female"}]
常见Json数据类型-综合型
{
"resultcode": "200",
"reason": "查询成功!",
"result": {
"sk": {
"temp": "21",
"wind_direction": "西风",
"wind_strength": "2级",
"humidity": "4%",
"time": "14:25"
},
"today": {
"city": "天津",
"date_y": "2014年03月21日",
"week": "星期五",
"temperature": "8℃~20℃",
"weather": "晴转霾",
"weather_id": {
"fa": "00",
"fb": "53"
},
"wind": "西南风微风",
"dressing_index": "较冷",
"dressing_advice": "建议着大衣、呢外套加毛衣、卫衣等服装。",
"uv_index": "中等",
"comfort_index": "",
"wash_index": "较适宜",
"travel_index": "适宜",
"exercise_index": "较适宜",
"drying_index": ""
},
"future": [
{
"temperature": "28℃~36℃",
"weather": "晴转多云",
"weather_id": {
"fa": "00",
"fb": "01"
},
"wind": "南风3-4级",
"week": "星期一",
"date": "20140804"
},
{
"temperature": "28℃~36℃",
"weather": "晴转多云",
"weather_id": {
"fa": "00",
"fb": "01"
},
"wind": "东南风3-4级",
"week": "星期二",
"date": "20140805"
},
{
"temperature": "27℃~35℃",
"weather": "晴转多云",
"weather_id": {
"fa": "00",
"fb": "01"
},
"wind": "东南风3-4级",
"week": "星期三",
"date": "20140806"
},
{
"temperature": "27℃~34℃",
"weather": "多云",
"weather_id": {
"fa": "01",
"fb": "01"
},
"wind": "东南风3-4级",
"week": "星期四",
"date": "20140807"
},
{
"temperature": "27℃~33℃",
"weather": "多云",
"weather_id": {
"fa": "01",
"fb": "01"
},
"wind": "东北风4-5级",
"week": "星期五",
"date": "20140808"
},
{
"temperature": "26℃~33℃",
"weather": "多云",
"weather_id": {
"fa": "01",
"fb": "01"
},
"wind": "北风4-5级",
"week": "星期六",
"date": "20140809"
},
{
"temperature": "26℃~33℃",
"weather": "多云",
"weather_id": {
"fa": "01",
"fb": "01"
},
"wind": "北风4-5级",
"week": "星期日",
"date": "20140810"
}
]
},
"error_code": 0}
Json解析中用到的工具
在解析的过程中通常对于比较复杂的综合型Json数据,我们通常无法很直观的看出各个解析节点的名称,这样不利于我们进行解析Json,我们可以在网上搜索格式化Json数据的网站,也可以使用Json数据格式化工具,我平常用的是HiJson,上面的第三个Json数据就是格式化后的Json数据.
Json解析代码示例
我将通过解析上面的三个JSON数据
对象型JSON数据解析
/**
* 解析对象型JSON数据
* 导包:import org.json.JSONObject
*/
protected void readJSONData(String data) {
try {
//如果是JSON对象,那么创建JSONObject的对象
JSONObject object01 = new JSONObject(data);
//通过键,得到值
int age = object01.getInt("age");
String name = object01.getString("name");
String sex = object01.getString("sex");
//组装字符串
String result = "姓名:"+name+"\n性别:"+sex+"\n年龄:"+age;
//显示数据在TextView上面
tv.setText(result);
} catch (Exception e) {
e.printStackTrace();
}
}
数组型JSON数据解析
> /**
* 解析数组型JSON数据
* 导包:import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
*/
protected void readJSONData(String data) {
try {
//定义StringBuffer
StringBuffer sb = new StringBuffer();
//如果当前的JSON数据是一个数组,那么创建JSONArray的对象
JSONArray array = new JSONArray(data);
//数组---遍历(循环)
//数组的长度 array.length();
//数组里面每一个元素array.getJSONObject(i);
for (int i = 0; i < array.length(); i++) {
//得到数组的每一个元素
JSONObject object = array.getJSONObject(i);
//得到数据
String name = object.getString("name");
String sex = object.getString("sex");
int age = object.getInt("age");
//组装字符串
sb.append("姓名:").append(name).append("\n");
sb.append("性别:").append(sex).append("\n");
sb.append("年龄:").append(age).append("\n");
sb.append("-------").append("\n");
}
//得到数据
tv.setText(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
综合型JSON数据解析
/***
* 解析综合型JSON数据
* 在上面的第三个Json数据中我想获得"future"后面的数据,即未来几天的天气
* 导包:import java.util.ArrayList;
* import org.json.JSONArray;
* import org.json.JSONObject;
* 需要用到一个JavaBean
*/
protected void readJSONData(String data) {
try {
//创建集合
ArrayList<MyBean> al = new ArrayList<MyBean>();
//创建JSONObject的对象
JSONObject object01 = new JSONObject(data);
//通过第一个数据得到对象
JSONObject object02 = object01.getJSONObject("result");
//通过第二个数据得到数组
JSONArray array01 = object02.getJSONArray("future");
//循环遍历
for (int i = 0; i < array01.length(); i++) {
//得到每一个对象
JSONObject object03 = array01.getJSONObject(i);
String xdate = object03.getString("date");
String xtemperature = object03.getString("temperature");
String xweather = object03.getString("weather");
String xweather_id = object03.getString("weather_id");
String xweek = object03.getString("week");
String xwind = object03.getString("wind");
//创建JavaBean的对象
MyBean bean = new MyBean(xdate, xtemperature, xweather, xweather_id, xweek, xwind);
//添加数据
al.add(bean);
}
//---------------------
StringBuffer sb = new StringBuffer();
//显示数据
for (int i = 0; i < al.size(); i++) {
MyBean bean = al.get(i);
sb.append("bean:"+bean.toString()).append("\n");
sb.append("------------").append("\n");
}
tv.setText(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
上面简单介绍了如何利用谷歌公司给我们提供的框架对Json数据进行解析,代码比较多,比较复杂;下面介绍一种简单的方式来进行数据的解析,网上有很多大神将谷歌的解析细节进行封装,开发了一条比较牛逼的框架专门用来解析JSON数据,这样提高了我们的开发效率,我也简单的介绍一下我经常使用的Gson框架来对上述的综合型Json数据进行解析.
自定义框架解析综合型Json数据
第一步:需要导入一个Gson的jar包,里面封装了解析的细节,获得jar包后导入你的项目.
第二步:写一个gson.jar文件封装的工具类JsonUtil,这段代码可以直接Copy,具体如下:
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONException;
import org.json.JSONObject;
import android.text.TextUtils;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
/**
* 封装的是使用Gson解析json的方法
*
*/
public class JsonUtil {
/**
* 把一个map变成json字符串
*/
public static String parseMapToJson(Map<?, ?> map) {
try {
Gson gson = new Gson();
return gson.toJson(map);
} catch (Exception e) {
}
return null;
}
/**
* 把一个json字符串变成对象
*/
public static <T> T parseJsonToBean(String json, Class<T> cls) {
Gson gson = new Gson();
T t = null;
try {
t = gson.fromJson(json, cls);
} catch (Exception e) {
}
return t;
}
/**
* 把json字符串变成map
*/
public static HashMap<String, Object> parseJsonToMap(String json) {
Gson gson = new Gson();
Type type = new TypeToken<HashMap<String, Object>>() {
}.getType();
HashMap<String, Object> map = null;
try {
map = gson.fromJson(json, type);
} catch (Exception e) {
}
return map;
}
/**
* 把json字符串变成集合 params: new TypeToken<List<yourbean>>(){}.getType(),
*/
public static List<?> parseJsonToList(String json, Type type) {
Gson gson = new Gson();
List<?> list = gson.fromJson(json, type);
return list;
}
/**
*
* 获取json串中某个字段的值,注意,只能获取同一层级的value
*/
public static String getFieldValue(String json, String key) {
if (TextUtils.isEmpty(json))
return null;
if (!json.contains(key))
return "";
JSONObject jsonObject = null;
String value = null;
try {
jsonObject = new JSONObject(json);
value = jsonObject.getString(key);
} catch (JSONException e) {
e.printStackTrace();
}
return value;
}
}
第三步:开始解析Json
/***
* 解析JSON数据
*
* @param data
*/
protected void readJSONData(String data) {
try {
// 解析JSON数据,采用gson框架
// 参数1:需要解析的JSON数据
// 参数2:子节点的名称
String json01 = JsonUtil.getFieldValue(data, "result");
// 解析第二层
String json02 = JsonUtil.getFieldValue(json01, "future");
//解析数组
List<MyBean> list = (List<MyBean>) JsonUtil.parseJsonToList(json02,
new TypeToken<List<MyBean>>() {
}.getType());
// 定义StringBuffer的对象
StringBuffer sb = new StringBuffer();
// 循环遍历
for (int i = 0; i < list.size(); i++) {
// 添加数据
MyBean bean = list.get(i);
sb.append("temperature:").append(bean.getTemperature()).append("\n");
sb.append("weather:").append(bean.getWeather()).append("\n");
sb.append("wind:").append(bean.getWind()).append("\n");
sb.append("week:").append(bean.getWeek()).append("\n");
sb.append("date:").append(bean.getDate()).append("\n");
sb.append("---------\n");
}
} catch (Exception e) {
e.printStackTrace();
}
}
以上是我总结的一些常用的Json数据解析的方法,希望可以帮到大家,如果有大神觉得有更多更好的办法也可以留言或者是直接给我发邮件,我的邮箱baiquanyu@yeah.net,谢谢!