自己编写了一个工具类,处理页面提交json格式数据到后台,再进行处理成JAVA对象数据
1、DTO:Data Transfer Object,数据传送对象
2、对于日期格式的问题,也已经处理
3、json-lib-2.2.2-jdk13.jar (2.1在日期数组 json->java有问题)
?
工具类JsonUtil代码如下:
?
- public ? class ?JsonUtil?{??
- ??
- ????/**页面传至后台时,json数据在request的参数名称*/ ??
- ????public ? final ? static ?String?JSON_ATTRIBUTE?=? "json" ;??
- ????public ? final ? static ?String?JSON_ATTRIBUTE1?=? "json1" ;??
- ????public ? final ? static ?String?JSON_ATTRIBUTE2?=? "json2" ;??
- ????public ? final ? static ?String?JSON_ATTRIBUTE3?=? "json3" ;??
- ????public ? final ? static ?String?JSON_ATTRIBUTE4?=? "json4" ;??
- ??????
- ????/** ?
- ?????*?从一个JSON?对象字符格式中得到一个java对象,形如: ?
- ?????*?{"id"?:?idValue,?"name"?:?nameValue,?"aBean"?:?{"aBeanId"?:?aBeanIdValue,?...}} ?
- ?????*?@param?object ?
- ?????*?@param?clazz ?
- ?????*?@return ?
- ?????*/ ??
- ????public ? static ?Object?getDTO(String?jsonString,?Class?clazz){??
- ????????JSONObject?jsonObject?=?null ;??
- ????????try {??
- ????????????setDataFormat2JAVA();???
- ????????????jsonObject?=?JSONObject.fromObject(jsonString);??
- ????????}catch (Exception?e){??
- ????????????e.printStackTrace();??
- ????????}??
- ????????return ?JSONObject.toBean(jsonObject,?clazz);??
- ????}??
- ??????
- ????/** ?
- ?????*?从一个JSON?对象字符格式中得到一个java对象,其中beansList是一类的集合,形如: ?
- ?????*?{"id"?:?idValue,?"name"?:?nameValue,?"aBean"?:?{"aBeanId"?:?aBeanIdValue,?...}, ?
- ?????*?beansList:[{},?{},?...]} ?
- ?????*?@param?jsonString ?
- ?????*?@param?clazz ?
- ?????*?@param?map?集合属性的类型?(key?:?集合属性名,?value?:?集合属性类型class)?eg:?("beansList"?:?Bean.class) ?
- ?????*?@return ?
- ?????*/ ??
- ????public ? static ?Object?getDTO(String?jsonString,?Class?clazz,?Map?map){??
- ????????JSONObject?jsonObject?=?null ;??
- ????????try {??
- ????????????setDataFormat2JAVA();???
- ????????????jsonObject?=?JSONObject.fromObject(jsonString);??
- ????????}catch (Exception?e){??
- ????????????e.printStackTrace();??
- ????????}??
- ????????return ?JSONObject.toBean(jsonObject,?clazz,?map);??
- ????}??
- ??????
- ????/** ?
- ?????*?从一个JSON数组得到一个java对象数组,形如: ?
- ?????*?[{"id"?:?idValue,?"name"?:?nameValue},?{"id"?:?idValue,?"name"?:?nameValue},?...] ?
- ?????*?@param?object ?
- ?????*?@param?clazz ?
- ?????*?@return ?
- ?????*/ ??
- ????public ? static ?Object[]?getDTOArray(String?jsonString,?Class?clazz){??
- ????????setDataFormat2JAVA();??
- ????????JSONArray?array?=?JSONArray.fromObject(jsonString);??
- ????????Object[]?obj?=?new ?Object[array.size()];??
- ????????for ( int ?i?=? 0 ;?i?<?array.size();?i++){??
- ????????????JSONObject?jsonObject?=?array.getJSONObject(i);??
- ????????????obj[i]?=?JSONObject.toBean(jsonObject,?clazz);??
- ????????}??
- ????????return ?obj;??
- ????}??
- ??????
- ????/** ?
- ?????*?从一个JSON数组得到一个java对象数组,形如: ?
- ?????*?[{"id"?:?idValue,?"name"?:?nameValue},?{"id"?:?idValue,?"name"?:?nameValue},?...] ?
- ?????*?@param?object ?
- ?????*?@param?clazz ?
- ?????*?@param?map ?
- ?????*?@return ?
- ?????*/ ??
- ????public ? static ?Object[]?getDTOArray(String?jsonString,?Class?clazz,?Map?map){??
- ????????setDataFormat2JAVA();??
- ????????JSONArray?array?=?JSONArray.fromObject(jsonString);??
- ????????Object[]?obj?=?new ?Object[array.size()];??
- ????????for ( int ?i?=? 0 ;?i?<?array.size();?i++){??
- ????????????JSONObject?jsonObject?=?array.getJSONObject(i);??
- ????????????obj[i]?=?JSONObject.toBean(jsonObject,?clazz,?map);??
- ????????}??
- ????????return ?obj;??
- ????}??
- ??????
- ????/** ?
- ?????*?从一个JSON数组得到一个java对象集合 ?
- ?????*?@param?object ?
- ?????*?@param?clazz ?
- ?????*?@return ?
- ?????*/ ??
- ????public ? static ?List?getDTOList(String?jsonString,?Class?clazz){??
- ????????setDataFormat2JAVA();??
- ????????JSONArray?array?=?JSONArray.fromObject(jsonString);??
- ????????List?list?=?new ?ArrayList();??
- ????????for (Iterator?iter?=?array.iterator();?iter.hasNext();){??
- ????????????JSONObject?jsonObject?=?(JSONObject)iter.next();??
- ????????????list.add(JSONObject.toBean(jsonObject,?clazz));??
- ????????}??
- ????????return ?list;??
- ????}??
- ??????
- ????/** ?
- ?????*?从一个JSON数组得到一个java对象集合,其中对象中包含有集合属性 ?
- ?????*?@param?object ?
- ?????*?@param?clazz ?
- ?????*?@param?map?集合属性的类型 ?
- ?????*?@return ?
- ?????*/ ??
- ????public ? static ?List?getDTOList(String?jsonString,?Class?clazz,?Map?map){??
- ????????setDataFormat2JAVA();??
- ????????JSONArray?array?=?JSONArray.fromObject(jsonString);??
- ????????List?list?=?new ?ArrayList();??
- ????????for (Iterator?iter?=?array.iterator();?iter.hasNext();){??
- ????????????JSONObject?jsonObject?=?(JSONObject)iter.next();??
- ????????????list.add(JSONObject.toBean(jsonObject,?clazz,?map));??
- ????????}??
- ????????return ?list;??
- ????}??
- ??????
- ????/** ?
- ?????*?从json?HASH表达式中获取一个map,该map支持嵌套功能 ?
- ?????*?形如:{"id"?:?"johncon",?"name"?:?"小强"} ?
- ?????*?注意commons-collections版本,必须包含org.apache.commons.collections.map.MultiKeyMap ?
- ?????*?@param?object ?
- ?????*?@return ?
- ?????*/ ??
- ????public ? static ?Map?getMapFromJson(String?jsonString)?{??
- ????????setDataFormat2JAVA();??
- ????????JSONObject?jsonObject?=?JSONObject.fromObject(jsonString);??
- ????????Map?map?=?new ?HashMap();??
- ????????for (Iterator?iter?=?jsonObject.keys();?iter.hasNext();){??
- ????????????String?key?=?(String)iter.next();??
- ????????????map.put(key,?jsonObject.get(key));??
- ????????}??
- ????????return ?map;??
- ????}??
- ??????
- ????/** ?
- ?????*?从json数组中得到相应java数组 ?
- ?????*?json形如:["123",?"456"] ?
- ?????*?@param?jsonString ?
- ?????*?@return ?
- ?????*/ ??
- ????public ? static ?Object[]?getObjectArrayFromJson(String?jsonString)?{??
- ????????JSONArray?jsonArray?=?JSONArray.fromObject(jsonString);??
- ????????return ?jsonArray.toArray();??
- ????}??
- ??
- ??
- ????/** ?
- ?????*?把数据对象转换成json字符串 ?
- ?????*?DTO对象形如:{"id"?:?idValue,?"name"?:?nameValue,?...} ?
- ?????*?数组对象形如:[{},?{},?{},?...] ?
- ?????*?map对象形如:{key1?:?{"id"?:?idValue,?"name"?:?nameValue,?...},?key2?:?{},?...} ?
- ?????*?@param?object ?
- ?????*?@return ?
- ?????*/ ??
- ????public ? static ?String?getJSONString(Object?object)? throws ?Exception{??
- ????????String?jsonString?=?null ;??
- ????????//日期值处理器 ??
- ????????JsonConfig?jsonConfig?=?new ?JsonConfig();??
- ????????jsonConfig.registerJsonValueProcessor(java.util.Date.class ,? new ?JsonDateValueProcessor());??
- ????????if (object?!=? null ){??
- ????????????if (object? instanceof ?Collection?||?object? instanceof ?Object[]){??
- ????????????????jsonString?=?JSONArray.fromObject(object,?jsonConfig).toString();??
- ????????????}else {??
- ????????????????jsonString?=?JSONObject.fromObject(object,?jsonConfig).toString();??
- ????????????}??
- ????????}??
- ????????return ?jsonString?==? null ??? "{}" ?:?jsonString;??
- ????}??
- ??????
- ????private ? static ? void ?setDataFormat2JAVA(){??
- ????????//设定日期转换格式 ??
- ????????JSONUtils.getMorpherRegistry().registerMorpher(new ?DateMorpher( new ?String[]?{ "yyyy-MM-dd" ,? "yyyy-MM-dd?HH:mm:ss" }));??
- ????}??
- ??????
- ????public ? static ? void ?main(String[]?arg)? throws ?Exception{??
- ????????String?s?=?"{status?:?'success'}" ;??
- ????????System.out.println("?object?:?" ?+?JsonUtil.getJSONString(s));??
- ????}??
- }??
?
?
对于java对象转换成json数据格式时,要对日期格式化常用格式,类:JsonDateValueProcessor
?
- import ?java.text.SimpleDateFormat;??
- import ?java.util.Date;??
- ??
- import ?net.sf.json.JsonConfig;??
- import ?net.sf.json.processors.JsonValueProcessor;??
- ??
- /* ?
- ?*?@author?johncon ?
- ?*?创建日期?2008-9-10 ?
- ?*?json日期值处理器 ?
- ?*/ ??
- public ? class ?JsonDateValueProcessor? implements ?JsonValueProcessor?{??
- ??
- ????private ?String?format?=? "yyyy-MM-dd?HH:mm:ss" ;??
- ??
- ????public ?JsonDateValueProcessor()?{??
- ??
- ????}??
- ??
- ????public ?JsonDateValueProcessor(String?format)?{??
- ????????this .format?=?format;??
- ????}??
- ??
- ????public ?Object?processArrayValue(Object?value,?JsonConfig?jsonConfig)?{??
- ????????return ?process(value,?jsonConfig);??
- ????}??
- ??
- ????public ?Object?processObjectValue(String?key,?Object?value,?JsonConfig?jsonConfig)?{??
- ????????return ?process(value,?jsonConfig);??
- ????}??
- ??????
- ????private ?Object?process(?Object?value,?JsonConfig?jsonConfig?)?{??
- ????????if ?(value? instanceof ?Date)?{??
- ????????????String?str?=?new ?SimpleDateFormat(format).format((Date)?value);??
- ????????????return ?str;??
- ????????}??
- ????????return ?value?==? null ??? null ?:?value.toString();??
- ????}??
- ??
- ????public ?String?getFormat()?{??
- ????????return ?format;??
- ????}??
- ??
- ????public ? void ?setFormat(String?format)?{??
- ????????this .format?=?format;??
- ????}??
- ??
- }??
?
?
?
对于对象中有明确类型的对象属性,可不管;但对象中有集合属性的,由于类型不明确,所以要先明确类型:
- String?jsonString?=?request.getParameter( "json" );??
- //增加对象中的集合属性的类型以及对象元素中的对象属性的集合属性的类型 ??
- Map?clazzMap?=?new ?HashMap();??
- //secondItems是FirstDTO里的集合属性 ??
- clazzMap.put("secondItems" ,?SecondDTO. class );??
- //thirdItems是SecondDTO里的集合属性 ??
- clazzMap.put("thirdItems" ,?ThirdDTO. class );??
- FirstDTO?firstDTO?=?(FirstDTO)JsonUtil.getDTO(jsonString,?FirstDTO.class ,?clazzMap);??
?
?
大家若对此类存意见、问题或建议,欢迎指出、指正,谢谢