在实际应用解析中经常会遇到各种格式的转换,因为大部分转换工具都依赖于开源框架,都知道学习一个框架的使用是需要一定的成本的,
假如在一个比较紧的项目中如果将一部分时间投入都学习工具的使用上,相对的于个人来说是比较困难的,接下来为使用最简单的方式完成json格式和java对象的最简单使用。
flexjson是一个不依赖与其他jar的一个 经典转换工具下载地址:
http://sourceforge.net/projects/flexjson/files/
1、定义标准返回值对象:
public class JSONInfo<T> {
private int code;
private String desc="成功";
private T jsonData;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public T getJsonData() {
return jsonData;
}
public void setJsonData(T jsonData) {
this.jsonData = jsonData;
}
}
JSONInfo对象是标准的json对象 将这个对象传递到客户端(浏览器给json处理) ,而这个对象可以表示服务器处理的情况。
成功或者失败。
当code为0时表示成功。
desc表示 code状态下的 中文描述
T这里使用了泛型 t可以是数组对象 任何类型
转换完成之后json格式{code:0,desc:'成功',jsonData:[]} [] 表示数组 {}表示对象
2、实验对象 也就是JSONInfo 中的jsonData T 对象。
public class Module implements Serializable {
private int id;
private String name;
private String url;
private int orderNo;
private List<Module> children;
private Module[] modules;
private Map map;
private Map<String,Module> moduleMap;
public Map<String, Module> getModuleMap() {
return moduleMap;
}
public void setModuleMap(Map<String, Module> moduleMap) {
this.moduleMap = moduleMap;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getOrderNo() {
return orderNo;
}
public void setOrderNo(int orderNo) {
this.orderNo = orderNo;
}
public List<Module> getChildren() {
return children;
}
public void setChildren(List<Module> children) {
this.children = children;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public Module[] getModules() {
return modules;
}
public void setModules(Module[] modules) {
this.modules = modules;
}
}
为了说明转换全面性特意设置了数组类型 和Map类型 List<Module>类型
json对象转换为java对象:
重点:如果json中有集合需要标明集合类型use("jsonData",ArrayList.class)和集合里面元素的类型use("jsonData.values",Module.class)
如果是Map需要use("jsonData.map.key",String.class)和集合里面元素的类型use("jsonData.map.value",Module.class) 相当于 Map<String,Module>
1、json格式是数组 (以module为例假如没有复杂类型) 转换为List<Module>格式:
String str="[{id:'2437',name:'1',url:'http://www.baidu.com',orderNo:'0'}]";
List<Module> ms = new JSONDeserializer<List<Module>>().use("values", Module.class).deserialize(str);
System.out.println(ms.get(0).getId());
2、
json格式是嵌套对象转换 (module 里面的moduleMap对象为泛型 )
String str="{'code':0,'desc':'获取成功',jsonData:[{moduleMap:{'qq':{id:'280',name:'聊天管理',url:'http://www.qq.com',orderNo:'0'}}
,id:'2437',name:'1',url:'http://www.baidu.com',orderNo:'0'}]}";
JSONInfo<List<Module>> ms = new JSONDeserializer<JSONInfo<List<Module>>>()
//因为jsonData是个数组 要表面是ArrayList.class类型
.use("jsonData", ArrayList.class)
//而数组里面的值是Module所以 要使用jsonData.value的形式来指定
.use("jsonData.values", Module.class)
//moduleMap的key是String类型
.use("jsonData.moduleMap.key", String.class)
//moduleMap的value是Module类型
.use("jsonData.moduleMap.value", Module.class)
.deserialize(str,JSONInfo.class);;
System.out.println(ms.getJsonData().get(0).getModuleMap().get("qq").getName());
3、 json格式嵌套对象转换 (module里面的children和modules对象为泛型)
String str="{'code':0,'desc':'获取成功',jsonData:[{modules:[
{id:'2430',name:'菜单管理',url:'http://www.sina.com',orderNo:'3'}],
children:[{id:'2438',name:'权限管理',url:'http://www.sohu.com',orderNo:'1'}],id:'2437',name:'1',url:'http://www.baidu.com',orderNo:'0'}]}";
JSONInfo<List<Module>> ms = new JSONDeserializer<JSONInfo<List<Module>>>()
//因为jsonData是个数组 要表面是ArrayList.class类型
.use("jsonData", ArrayList.class)
//而数组里面的值是Module所以 要使用jsonData.value的形式来指定
.use("jsonData.values", Module.class)
//声明children List是 ArrayList类型
.use("jsonData.values.children", ArrayList.class)
//声明ArrayList 中的类型是 Module
.use("jsonData.values.children.values", Module.class)
//声明Module[]类型
.use("jsonData.modules", Module[].class)
//声明Module[]中类型的 类型
.use("jsonData.modules.values", Module.class)
.deserialize(str,JSONInfo.class);;
//获取module数组里面的 东西
System.out.println(ms.getJsonData().get(0).getModules()[0].getName());
//获取children里面的第一个元素
System.out.println(ms.getJsonData().get(0).getChildren().get(0).getName());
4、综合json格式转换为java转换 整合:
String str="{'code':0,'desc':'获取成功',jsonData:[{moduleMap:{'qq':{id:'280',name:'聊天管理',url:'http://www.qq.com',orderNo:'0'}},modules:[{id:'2430',name:'菜单管理',url:'http://www.sina.com',orderNo:'3'}],map:{name:'lunce','age':11},id:'2437',name:'1',url:'http://www.baidu.com',orderNo:'0',children:[{id:'2438',name:'权限管理',url:'http://www.sohu.com',orderNo:'1'}]}]}";
JSONInfo<List<Module>> ms = new JSONDeserializer<JSONInfo<List<Module>>>()
//因为jsonData是个数组 要表面是ArrayList.class类型
.use("jsonData", ArrayList.class)
//而数组里面的值是Module所以 要使用jsonData.value的形式来指定
.use("jsonData.values", Module.class)
//声明Module[]类型
.use("jsonData.modules", Module[].class)
//声明Module[]中类型的 类型
.use("jsonData.modules.values", Module.class)
//moduleMap的key是String类型
.use("jsonData.moduleMap.key", String.class)
//moduleMap的value是Module类型
.use("jsonData.moduleMap.value", Module.class)
//map无泛型类的转换
.use("jsonData.map",Map.class)
//声明children List是 ArrayList类型
.use("jsonData.values.children", ArrayList.class)
//声明ArrayList 中的类型是 Module
.use("jsonData.values.children.values", Module.class)
.deserialize(str,JSONInfo.class);
//获取moduleMap中的值
System.out.println(ms.getJsonData().get(0).getModuleMap().get("qq").getName());
//获取modules[]中的值
System.out.println(ms.getJsonData().get(0).getModules()[0].getName());
//获取map中的值
System.out.println(ms.getJsonData().get(0).getMap().get("name"));
//获取children 中的值
System.out.println(ms.getJsonData().get(0).getChildren().get(0).getName());
java对象转换为json格式:
java 对象转换为json相对来说比较简单
/**
*
* @Title: newModule
* @Description: TODO(过滤所有的class属性) 参数说明
*/
public Module newModule() {
Module m = new Module();
m.setName("权限管理");
//m.setId(1);
Module m1 = new Module();
m1.setName("用户管理");
List list=new ArrayList();
list.add(m1);
m.setChildren(list);
return m;
}
/**
*
* @Title: newModule
* @Description: TODO(过滤所有的class属性) 参数说明
*/
public void ObjToJson1() {
//exclude排除不需要转换的属性
String json=new JSONSerializer().exclude("*.class","*.id").deepSerialize(newModule());
System.out.println(json);
}
调用excule使用"*.class"表示排除所有 class属性,如果需要限定完整属性名 ,那么要将名称写完整 jsonData.modules.id排除modules下面的元素的 id