首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

java对象与json字符串互转的工具种

2012-10-31 
java对象与json字符串互转的工具类import java.beans.PropertyDescriptorimport java.lang.reflect.Array

java对象与json字符串互转的工具类

import java.beans.PropertyDescriptor;import java.lang.reflect.Array;import java.lang.reflect.InvocationTargetException;import java.math.BigDecimal;import java.math.BigInteger;import java.net.URLDecoder;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import java.util.Map.Entry;import ognl.OgnlOps;import org.apache.commons.lang.StringUtils;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.json.JSONArray;import org.json.JSONObject;import com.opensymphony.xwork.util.OgnlUtil;/** * java对象与json字符串互转的工具类 *  */public class JsonUtil {/** * 将json字符串转成javabean * @param jsonStr 要转换的json字符串 * @param toClass 要转化到的类型 * @param childMap 该类型中集合字段的字段名和集合元素类型map * @return Object  * @throws InvocationTargetException  * @throws IllegalAccessException  * @throws IllegalArgumentException  */@SuppressWarnings("unchecked")    public static Object json2Bean(Class toClass,String  jsonValue,Map<String,Class> childMap) throws Exception{if( toClass == null || StringUtils.isBlank(jsonValue)) {return null;}    try{     jsonValue= URLDecoder.decode(jsonValue, "utf-8");    }catch(Exception e){    throw new Exception("编码格式错误!");    }JSONObject object = null;try{ object= new JSONObject(jsonValue);}catch(Exception e){throw new Exception("json格式错误!");}Object obj = toClass.newInstance();Map<String,Object> sourceMap = toMap(object);PropertyDescriptor[] props = OgnlUtil.getPropertyDescriptors(obj);Map<String,Object> map = new HashMap<String,Object>();//参数不区分大小写for (PropertyDescriptor desc : props) {  Set entrys =  sourceMap.entrySet();  boolean contains = false;  for(Iterator i = entrys.iterator();i.hasNext();){  Entry entry = (Entry) i.next();  if(((String)entry.getKey()).equalsIgnoreCase(desc.getName())){  map.put(desc.getName(), entry.getValue());  contains = true;       break;  }  }  if( contains ) {Object value = null;// 处理日期型// "yyyy-MM-dd'T'HH:mm:ss'Z'"此格式是由json2.js转换后的Date格式if(java.util.Date.class.isAssignableFrom(desc.getPropertyType())) {  String date = (String) map.get(desc.getName());  if(!validateDate(date)){  throw new Exception(desc.getName()+"日期格式错误!");  }   value = new SimpleDateFormat("yyyy-MM-dd").parse(date.trim());} else if(java.sql.Date.class.isAssignableFrom(desc.getPropertyType())) {String date = (String) map.get(desc.getName()); if(!validateDate(date)){  throw new Exception(desc.getName()+"日期格式错误!");  }  value  = new java.sql.Date(new SimpleDateFormat("yyyy-MM-dd").parse(date.trim()).getTime());}  else if(Collection.class.isAssignableFrom(desc.getPropertyType()))  {  Class clz =  childMap.get(desc.getName());  if(clz.isPrimitive() || CharSequence.class.isAssignableFrom(clz) || Number.class.isAssignableFrom(clz))   value = convertFromStringListSimple(map.get(desc.getName()).toString(),clz);  else value = convertFromStringListComplex(map.get(desc.getName()).toString(),clz);  }  else {    if(desc.getPropertyType().isPrimitive() || CharSequence.class.isAssignableFrom(desc.getPropertyType())  || Number.class.isAssignableFrom(desc.getPropertyType())){  try{ value = OgnlOps.convertValue(map.get(desc.getName()),desc.getPropertyType());  }catch(NumberFormatException e){  Class clz = desc.getPropertyType();if(clz == Integer.TYPE||clz == Short.TYPE||clz == Long.TYPE||clz == BigInteger.class)  throw new Exception(desc.getName()+"应为整数!");else if(clz == Double.TYPE||clz == Float.TYPE||clz == BigDecimal.class)  throw new Exception(desc.getName()+"应为数字!");  }  }  else {  value = json2Bean(desc.getPropertyType(),map.get(desc.getName()).toString(),null);  }}desc.getWriteMethod().invoke(obj, new Object[] { value });}}  return obj;}/** * 将json字符串转成javabean 日期格式默认为yyyy-MM-dd HH:mm:ss * @param jsonStr 要转换的json字符串 * @param toClass 要转化到的类型 * @param childMap 该类型中集合字段的字段名和集合元素类型map * @param DateStyle 日期时间格式 * @return Object  * @throws InvocationTargetException  * @throws IllegalAccessException  * @throws IllegalArgumentException  * @throws ParseException  */@SuppressWarnings("unchecked")    public static Object json2Bean(Class toClass,String  jsonValue,Map<String,Class> childMap,String DateStyle) throws Exception{if(StringUtils.isBlank(DateStyle)){DateStyle = DateUtil.DEFAULT_DATETIME_FORMAT;}if( toClass == null) {return null;}    try{     jsonValue= URLDecoder.decode(jsonValue, "utf-8");    }catch(Exception e){    throw new Exception("编码格式错误!");    }JSONObject object = null;try{ object= new JSONObject(jsonValue);}catch(Exception e){throw new Exception("json格式错误!");}Object obj = toClass.newInstance();Map<String,Object> sourceMap = toMap(object);PropertyDescriptor[] props = OgnlUtil.getPropertyDescriptors(obj);Map<String,Object> map = new HashMap<String,Object>();//参数不区分大小写for (PropertyDescriptor desc : props) {  Set entrys =  sourceMap.entrySet();  boolean contains = false;  for(Iterator i = entrys.iterator();i.hasNext();){  Entry entry = (Entry) i.next();  if(((String)entry.getKey()).equalsIgnoreCase(desc.getName())){  map.put(desc.getName(), entry.getValue());  contains = true;       break;  }  }  if( contains ) {Object value = null;// 处理日期型// "yyyy-MM-dd'T'HH:mm:ss'Z'"此格式是由json2.js转换后的Date格式if(java.util.Date.class.isAssignableFrom(desc.getPropertyType())) {  String date = (String) map.get(desc.getName());   try{  value = new SimpleDateFormat(DateStyle).parse(date.trim());  }catch(ParseException e3){  throw new Exception(desc.getName()+"="+date+";日期格式错误!");  }} else if(java.sql.Date.class.isAssignableFrom(desc.getPropertyType())) {  String date = (String) map.get(desc.getName());                      try{value  = new java.sql.Date(new SimpleDateFormat(DateStyle).parse(date.trim()).getTime());                      }catch(ParseException e3){  throw new Exception(desc.getName()+"="+date+";日期格式错误!");  }}  else if(Collection.class.isAssignableFrom(desc.getPropertyType()))  {  Class clz =  childMap.get(desc.getName());  if(clz.isPrimitive() || CharSequence.class.isAssignableFrom(clz) || Number.class.isAssignableFrom(clz))   value = convertFromStringListSimple(map.get(desc.getName()).toString(),clz);  else value = convertFromStringListComplex(map.get(desc.getName()).toString(),clz);  }  else {    if(desc.getPropertyType().isPrimitive() || CharSequence.class.isAssignableFrom(desc.getPropertyType())  || Number.class.isAssignableFrom(desc.getPropertyType())){  try{ value = OgnlOps.convertValue(map.get(desc.getName()),desc.getPropertyType());  }catch(NumberFormatException e){  Class clz = desc.getPropertyType();if(clz == Integer.TYPE||clz == Short.TYPE||clz == Long.TYPE||clz == BigInteger.class)  throw new Exception(desc.getName()+"应为整数!");else if(clz == Double.TYPE||clz == Float.TYPE||clz == BigDecimal.class)  throw new Exception(desc.getName()+"应为数字!");  }  }  else {  value = json2Bean(desc.getPropertyType(),map.get(desc.getName()).toString(),null);  }}desc.getWriteMethod().invoke(obj, new Object[] { value });}}   return obj;}public static Map<String,Object> json2Map(String jsonValue) throws Exception{if (StringUtils.isBlank(jsonValue)) {return null;}try {jsonValue = URLDecoder.decode(jsonValue, "utf-8");} catch (Exception e) {throw new Exception("编码格式错误!");}JSONObject object = null;try {object = new JSONObject(jsonValue);} catch (Exception e) {throw new Exception("json格式错误!");}return toMap(object);}@SuppressWarnings("unchecked")    public static List<Map<String,String>> json2List(String jsonValue) throws Exception{if (StringUtils.isBlank(jsonValue)) {return null;}try {jsonValue = URLDecoder.decode(jsonValue, "utf-8");} catch (Exception e) {throw new Exception("编码格式错误!");}JSONArray array = new JSONArray(jsonValue);List<Map<String,String>> jsonList = new ArrayList<Map<String,String>>();for(int i=0;i<array.length();i++){Map jsonMap = toMap(array.getJSONObject(i));jsonList.add(jsonMap);}return jsonList;}public static  boolean validateDate(String date){   if(date == null ||date.trim().length() != 10)   return false;   else    {      date = date.trim();      String[] param =  date.split("-");      if(param[0].length() != 4)      return false;      int month = Integer.parseInt(param[1]);      if(month < 1 || month > 12)      return false;      int day = Integer.parseInt(param[2]);      if(day < 1 || day > 31)      return false;     }   return true;}    @SuppressWarnings("unchecked")    private static Object  convertFromStringListSimple (String jsonValue,Class toClass) throws Exception    {    if( toClass == null) {return null;}    ArrayList<Object> list = new ArrayList<Object>();JSONArray array = new JSONArray(jsonValue);int i;Object value = null;            for(i = 0; i < array.length(); i++)            {            Object property = array.get(i);            if(java.util.Date.class.isAssignableFrom(toClass))            {             String date = (String)property;             if(!validateDate(date)){  throw new Exception("日期格式错误!");  }value = new SimpleDateFormat("yyyy-MM-dd").parse(date.trim());            }            else if(java.sql.Date.class.isAssignableFrom(toClass)){              String date = (String)property;            if(!validateDate(date)){  throw new Exception("日期格式错误!");  }            value = new java.sql.Date(new SimpleDateFormat("yyyy-MM-dd").parse(date.trim()).getTime());            }else value = OgnlOps.convertValue(property, toClass);             list.add(value);            }            return list;}    @SuppressWarnings("unchecked")    private static Object convertFromStringListComplex( String jsonValue, Class toClass) throws Exception{ if( toClass == null) {return null;}ArrayList<Object> list = new ArrayList<Object>();JSONArray array = new JSONArray(jsonValue);for (int i = 0; i < array.length(); i++) {Object obj = toClass.newInstance();Map map = toMap(array.getJSONObject(i));PropertyDescriptor[] props = OgnlUtil.getPropertyDescriptors(obj);for (PropertyDescriptor desc : props) {if( map.containsKey(desc.getName()) ) {Object value = null;// 处理日期型// "yyyy-MM-dd'T'HH:mm:ss'Z'"此格式是由json2.js转换后的Date格式if(java.util.Date.class.isAssignableFrom(desc.getPropertyType())) {String date = (String) map.get(desc.getName());  if(!validateDate(date)){  throw new Exception(desc.getName()+"日期格式错误!");  }   value = new SimpleDateFormat("yyyy-MM-dd").parse(date.trim());} else if(java.sql.Date.class.isAssignableFrom(desc.getPropertyType())) {String date = (String) map.get(desc.getName()); if(!validateDate(date)){  throw new Exception(desc.getName()+"日期格式错误!");  }  value  = new java.sql.Date(new SimpleDateFormat("yyyy-MM-dd").parse(date.trim()).getTime());} else {    try{value = OgnlOps.convertValue(map.get(desc.getName()),desc.getPropertyType());}catch(NumberFormatException e){Class clz = desc.getPropertyType();if(clz == Integer.class||clz == Short.class||clz == Long.class||clz == BigInteger.class)  throw new Exception(desc.getName()+"应为整数!");else if(clz == Double.class||clz == Float.class||clz == BigDecimal.class)  throw new Exception(desc.getName()+"应为数字!");  }}desc.getWriteMethod().invoke(obj, new Object[] { value });}}list.add(obj);}                return list;}@SuppressWarnings("unchecked")    private  static Map<String,Object> toMap(JSONObject object) throws Exception {HashMap<String, Object> map = new HashMap<String, Object>();Iterator iter = object.keys();while (iter.hasNext()) {String key = (String) iter.next();Object val = object.get(key);if(val != null && !val.toString().trim().equals(""))map.put(key,val);}return map;}/** * 将javabean转成json字符串 * @param cls 要转的javabean类型 * @param value 要转的javabean * @return String *  */public static String bean2Json(Class<?> cls, Object value)  {try {return transToJSONObject(cls, value).toString();} catch (Exception e) {log.error("转换jsonObject失败",e);return null;}}// 将value转换成JSONObject@SuppressWarnings("unchecked")    private static Object transToJSONObject(Class<?> cls, Object value) throws Exception {Object json = null;if (value != null) {if (Collection.class.isAssignableFrom(cls)) {// 列表sIterator iter = ((Collection) value).iterator();JSONArray array = new JSONArray();while (iter.hasNext()) {Object element = iter.next();if( element != null ) {array.put(transToJSONObject(element.getClass(), element));}}json = array;} else if (cls.isArray()) {// 数组JSONArray array = new JSONArray();int length = Array.getLength(value);for (int i = 0; i < length; i++) {Object element = Array.get(value, i);if( element != null ) {array.put(transToJSONObject(element.getClass(), element));}}json = array;}  else if (Map.class.isAssignableFrom(cls)) {// 映射Iterator iter = ((Map) value).entrySet().iterator();JSONObject object = new JSONObject();while (iter.hasNext()) {Map.Entry entry = (Map.Entry) iter.next();Object v = entry.getValue();if( v != null ) {object.put(entry.getKey().toString(), transToJSONObject(v.getClass(), v));}}json = object;} else if (cls.isPrimitive() || CharSequence.class.isAssignableFrom(cls) || Number.class.isAssignableFrom(cls)) {// 基本类型、数值或字符串if (cls == Boolean.TYPE|| cls == Integer.TYPE|| cls ==   Float.TYPE|| cls ==  Double.TYPE|| cls ==    Long.TYPE|| cls ==   Short.TYPE|| cls ==    Byte.TYPE|| cls.isAssignableFrom(Number.class)) {json = value;} else {json = value.toString();}} else if (java.util.Date.class.isAssignableFrom(cls) || java.sql.Date.class.isAssignableFrom(cls)) {json = value.toString();} else {// 对象Map map = OgnlUtil.getBeanMap(value);JSONObject object = new JSONObject();if ( map != null ) {Iterator iter = map.entrySet().iterator();while (iter.hasNext()) {Map.Entry element = (Map.Entry) iter.next();Object v = element.getValue();if( v != null ) {object.put((String)element.getKey(), transToJSONObject(v.getClass(), v));}else{object.put((String)element.getKey(), "null");}}json = object;}}}return json == null ? "" : json;}@SuppressWarnings("unchecked")    public static void main(String args[]) throws Exception{String str = "["1","2","3","4"]";ArrayList list = (ArrayList)JsonUtil.json2Bean(ArrayList.class, str, null);System.out.println(list.get(0));}private static Log log = LogFactory.getLog(JsonUtil.class);}
?

热点排行
Bad Request.