package com.linzl.cn.json;
import java.util.Date;
/**
测试VO
**/
public class Demo {
private String name;
private Date date;
public Demo() {
}
public Demo(String name, Date date) {
this.name = name;
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "Demo [name=" + name + ", date=" + date + "]";
}
}
package com.linzl.cn.json;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
/**
* 关于时间的json处理器的应用 json-lib
*/
public class DateJsonValueProcessor implements JsonValueProcessor {
public static final String DEFAULT_DATE_PATTERN = “yyyy-MM-dd HH:mm:ss”;
private DateFormat dateFormat;
public DateJsonValueProcessor(String datePattern) {
if (null == datePattern)
dateFormat = new SimpleDateFormat(DEFAULT_DATE_PATTERN);
else
dateFormat = new SimpleDateFormat(datePattern);
}
private Object process(Object value) {
if (value != null) {
return dateFormat.format((Date) value);
} else {
return "";
}
}
public Object processArrayValue(Object arg0, JsonConfig arg1) {
return process(arg0);
}
public Object processObjectValue(String arg0, Object arg1, JsonConfig arg2) {
return process(arg1);
}
}
package com.linzl.cn.json;
import net.sf.json.util.PropertyFilter;
/**
空属性过滤器
**/
public class EmptyPropertyFilter implements PropertyFilter {
// 将值为空的属性过滤,尤其当时间为空时,json转 bean,会出现Class net.sf.ezmorph.MorphException:
// Unable to parse the date
public boolean apply(Object source, String name, Object value) {
if (value == null) {
return true;
}
if (value instanceof String) {
String keyValue = (String) value;
if (keyValue == null || "".equals(keyValue.trim())
|| "null".equals(keyValue.trim())) {
return true;
}
}
return false;
}
}
package com.linzl.cn.json;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.sf.ezmorph.bean.MorphDynaBean;
import net.sf.ezmorph.object.DateMorpher;
import net.sf.json.JSON;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
import net.sf.json.JsonConfig;
import net.sf.json.util.JSONUtils;
import net.sf.json.xml.XMLSerializer;
/**
* JSON和JAVA的bean的相互转换 JSONHelper.java
*/
public final class JSONHelper {
/**
* 将 数组 \Collection\Map | xml字符串 | VO对象 转换成 JSON
*
* @param obj
* @return
*/
public static String toJSON(Object obj) {
boolean flag = true;
String json = "";
if (obj instanceof String) {
flag = false;
String xml = (obj == null ? "" : (String) obj);
if (xml.startsWith("<?xml")) {
XMLSerializer xmlSerializer = new XMLSerializer();
json = ((JSON) xmlSerializer.read(xml)).toString(2);
} else {
flag = true;
}
}
if (flag) {
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.class,
new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
jsonConfig.setJsonPropertyFilter(new EmptyPropertyFilter());
json = JSONSerializer.toJSON(obj, jsonConfig).toString();
}
return json;
}
/**
*
* @param json
* 可以为普通json字符串,也可以是JSONArray或JSONObject对象
* @param beanClz
* json数据中存储的bean对象,可以为Null
* @return List or Map
*/
public static Object toCollection(Object json, Class beanClz) {
if (json instanceof String) {// 由collection转成JSON数据,现在要转回集合
if (json == null || "".equals(json.toString().trim())) {
try {
throw new Exception("json参数不能为空");
} catch (Exception e) {
e.printStackTrace();
}
}
if (!json.toString().startsWith("{")
&& !json.toString().startsWith("[")) {
try {
throw new Exception("json数据必须是{或[开头");
} catch (Exception e) {
e.printStackTrace();
}
}
if (json.toString().startsWith("[")) {
json = JSONArray.fromObject(json);
} else if (json.toString().startsWith("{")) {
json = JSONObject.fromObject(json);
}
}
if (json instanceof JSONArray) {
JSONArray list = (JSONArray) json;
if (beanClz == null) {// 得到的是一个存储着动态bean的list
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setRootClass(beanClz);
// 设置过滤器
jsonConfig.setJavaPropertyFilter(new EmptyPropertyFilter());
return (List) JSONSerializer.toJava(list, jsonConfig);
} else {
return (List) JSONArray.toCollection(list, beanClz);
}
} else if (json instanceof JSONObject) {
if (beanClz != null) {
Map resultMap = new HashMap();
JSONObject map = (JSONObject) json;
Set set = map.keySet();
Iterator iter = set.iterator();
Object key = null;
Object vo = null;
while (iter.hasNext()) {
key = iter.next();
vo = toBean(map.get(key).toString(), beanClz);
resultMap.put(key, vo);
}
return resultMap;
} else {// map中放的是JSONObject
return (Map) json;
}
}
return null;
}
/**
* 将json转换成xml格式
*
* @param object
* @return
*/
public static String toXml(Object obj) {
JSON json = JSONSerializer.toJSON(obj);
XMLSerializer xmlSerializer = new XMLSerializer();
// xmlSerializer.setTypeHintsEnabled(false);
// change node names
xmlSerializer.setRootName("root");
return xmlSerializer.write(json);
}
/**
* json由JavaBean转换而来,JavaBean只拥有简单属性
*
* @param json
* @param beanClz
* @return
*/
public static Object toBean(String json, Class beanClz) {
JSONUtils.getMorpherRegistry().registerMorpher(
new DateMorpher(new String[] { "yyyy-MM-dd HH:mm:ss" }));
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setRootClass(beanClz);
jsonConfig.setJavaPropertyFilter(new EmptyPropertyFilter());
JSON jsonObject = JSONSerializer.toJSON(json);
return JSONSerializer.toJava(jsonObject, jsonConfig);
}
public static void main(String[] args) {
JSONHelper helper = new JSONHelper();
// helper.simpleVO();
// helper.xmlJson();
// String listJson =
// "[{\"date\":\"2013-10-21 22:57:09\",\"name\":\"linzl\"},{\"date\":\"\",\"name\":\"linwc\"},{\"date\":\"2014-10-26 22:57:09\",\"name\":\"linsj\"}]";
// List resultList = (List) toCollection(listJson, null);
// for (int i = 0; i < resultList.size(); i++) {
// MorphDynaBean listDemo = (MorphDynaBean) resultList.get(i);
// // System.out.println("第" + i + "个-->\n" + listDemo);
// System.out.println(listDemo.get("date"));
// System.out.println(listDemo.get("name"));
// }
// helper.listVO();
// helper.setVO();
// String mapJson =
// "{\"second\":{\"name\":\"linwc\"},\"third\":{\"date\":\"2014-10-26 23:31:08\",\"name\":\"linsj\"},\"first\":{\"date\":\"2014-10-26 23:31:08\",\"name\":\"linzl\"}}";
// Map map = (Map) toCollection(mapJson, null);
// Set set = map.keySet();
// Iterator iter = set.iterator();
// boolean flag = false;
// while (iter.hasNext()) {
// Object key = iter.next();
// System.out.println(key);
// if (flag) {// 知道转换成bean的class信息
// Demo demo = (Demo) toBean(map.get(key).toString(), Demo.class);
// System.out.println(demo);
// } else {
// JSONObject obj = (JSONObject) map.get(key);
// System.out.println("name-->" + obj.get("name"));
// System.out.println("date-->" + obj.get("date"));
// }
// }
helper.mapVO();
}
/**
* 测试例子:简单bean的转换
*/
private void simpleVO() {
String json = "{\"date\":\"\",\"name\":\"linzl\"}";
Demo demo = (Demo) toBean(json, Demo.class);
System.out.println(demo);
}
/**
* 测试例子:json与xml的转换
*/
private void xmlJson() {
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>"
+ "<link>"
+ "<first firstAge=\"25\">测试w3cshool 生成xml first</first>"
+ "<second secondAge=\"没有值\">测试w3cshool 生成xml second</second>"
+ "</link>";
System.out.println("xml转成JSON-->\n" + toJSON(xml));// 转成JSON
System.out.println("JSON转成xml-->\n" + toXml(toJSON(xml)));// 由JSON转回xml
}
/**
* 测试例子:List拥有多个简单bean的转换
*/
private void listVO() {
List resultList = null;
List list = new ArrayList();
list.add(new Demo("linzl", new Date()));
list.add(new Demo("linwc", null));
list.add(new Demo("linsj", new Date()));
String listJson = toJSON(list);
System.out.println("List多个bean的转换-->" + listJson);
// 测试由list存储vo得到的json数据,还原为list且存储的内容为对应的vo
Class beanClz = Demo.class;
resultList = (List) toCollection(listJson, beanClz);
if (beanClz == null) {// 动态bean,将对应的属性取出来后再set到对应的vo属性去
for (int i = 0; i < resultList.size(); i++) {
MorphDynaBean listDemo = (MorphDynaBean) resultList.get(i);
System.out.println("---------------第" + i + "个---------------");
System.out.println(listDemo.get("name"));
System.out.println(listDemo.get("date"));
}
} else {
for (int i = 0; i < resultList.size(); i++) {
Demo listDemo = (Demo) resultList.get(i);
System.out.println("第" + i + "个-->\n" + listDemo);
}
}
}
/**
* 测试例子: Set拥有多个简单bean的转换 和list是一个道理
*/
private void setVO() {
Set set = new HashSet();
set.add(new Demo("linzl", new Date()));
set.add(new Demo("linwc", null));
set.add(new Demo("linsj", new Date()));
String setJson = toJSON(set);
System.out.println("Set多个bean的转换-->" + setJson);
// 测试由list存储vo得到的json数据,还原为list且存储的内容为对应的vo
List setList = (List) toCollection(setJson, Demo.class);
for (int i = 0; i < setList.size(); i++) {
Demo setDemo = (Demo) setList.get(i);
System.out.println("第" + i + "个-->\n" + setDemo);
}
}
/**
* 测试例子:Map拥有多个简单bean的转换
*/
private void mapVO() {
Map map = new HashMap();
map.put("first", new Demo("linzl", new Date()));
map.put("second", new Demo("linwc", null));
map.put("third", new Demo("linsj", new Date()));
String mapJson = toJSON(map);
System.err.println("Map多个bean的转换-->" + mapJson);
Map resultMap = null;
Class beanClz = null;// Demo.class;
if (beanClz != null) {// 知道转换成bean的class信息
resultMap = (Map) toCollection(mapJson, Demo.class);
System.out.println(resultMap);
} else {// 不知道转换成bean的class信息,则通过get出来后再set到对应的vo属性去
resultMap = (Map) toCollection(mapJson, null);
Set set = resultMap.keySet();
Iterator iter = set.iterator();
while (iter.hasNext()) {
Object key = iter.next();
JSONObject obj = (JSONObject) resultMap.get(key);
System.out.println(key);
System.out.println("name-->" + obj.get("name"));
System.out.println("date-->" + obj.get("date"));
System.out.println();
}
}
}
}