Android用Gson解析复杂Json
2016-04-13 20:34
537 查看
前几天用Gson解析项目里的一个json,竟然频频出错,这让我很是郁闷,曾经的一个项目为了解析一个json,写了13个bean类,自此认为再往后遇到json就无压力了,可是我还是小看了遗忘的力量.自此写点博客,来记录项目中遇到的问题.以下2条转自其他人总结.
1、类里面的属性名必须跟Json字段里面的Key是一模一样的;
2、内部嵌套的用[]括起来的部分是一个List,所以定义为 public List<B> b,而只用{}嵌套的就定义为 public C c.
这里遗忘的关键是[]和{}的区别,前一个是List<bean>,后一个直接为一个类.
下面举出实例区分:
Gson解析的json的JsonUtil类:
/**
* 把一个map变成json字符串
* @param map
* @return
*/
public static String parseMapToJson(Map<?, ?> map) {
try {
Gson gson = new Gson();
return gson.toJson(map);
} catch (Exception e) {
}
return null;
}
/**
* 把一个json字符串变成对象
* @param json
* @param cls
* @return
*/
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
* @param json
* @return
*/
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(),
*
* @param json
* @param type new TypeToken<List<yourbean>>(){}.getType()
* @return
*/
public static List<?> parseJsonToList(String json, Type type) {
Gson gson = new Gson();
List<?> list = gson.fromJson(json, type);
return list;
}
/**
*
* 获取json串中某个字段的值,注意,只能获取同一层级的value
*
* @param json
* @param key
* @return
*/
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的情况:
IntegralBean 为一个bean 类
IntegralBean integralDetail = new IntegralBean();
integralDetail = JsonUtil.parseJsonToBean(backdata,IntegralBean.class);
backdata为String 类型的json数据
当最外面为[]时为一个List,列出使用工具类解析的方法:
IntegralTimeBean也为一个bean类
List<IntegralTimeBean> integralDetailTimeList = new ArrayList<IntegralTimeBean>();
integralDetailTimeList = (ArrayList<IntegralTimeBean>) JsonUtil
.parseJsonToList(backdataMoth,
new TypeToken<List<IntegralTimeBean>>() {
}.getType());
backdataMoth为String 类型的json数据
1、类里面的属性名必须跟Json字段里面的Key是一模一样的;
2、内部嵌套的用[]括起来的部分是一个List,所以定义为 public List<B> b,而只用{}嵌套的就定义为 public C c.
这里遗忘的关键是[]和{}的区别,前一个是List<bean>,后一个直接为一个类.
下面举出实例区分:
Gson解析的json的JsonUtil类:
/**
* 把一个map变成json字符串
* @param map
* @return
*/
public static String parseMapToJson(Map<?, ?> map) {
try {
Gson gson = new Gson();
return gson.toJson(map);
} catch (Exception e) {
}
return null;
}
/**
* 把一个json字符串变成对象
* @param json
* @param cls
* @return
*/
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
* @param json
* @return
*/
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(),
*
* @param json
* @param type new TypeToken<List<yourbean>>(){}.getType()
* @return
*/
public static List<?> parseJsonToList(String json, Type type) {
Gson gson = new Gson();
List<?> list = gson.fromJson(json, type);
return list;
}
/**
*
* 获取json串中某个字段的值,注意,只能获取同一层级的value
*
* @param json
* @param key
* @return
*/
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的情况:
IntegralBean 为一个bean 类
IntegralBean integralDetail = new IntegralBean();
integralDetail = JsonUtil.parseJsonToBean(backdata,IntegralBean.class);
backdata为String 类型的json数据
当最外面为[]时为一个List,列出使用工具类解析的方法:
IntegralTimeBean也为一个bean类
List<IntegralTimeBean> integralDetailTimeList = new ArrayList<IntegralTimeBean>();
integralDetailTimeList = (ArrayList<IntegralTimeBean>) JsonUtil
.parseJsonToList(backdataMoth,
new TypeToken<List<IntegralTimeBean>>() {
}.getType());
backdataMoth为String 类型的json数据
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories