欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于JSON和java对象的互转方法

程序员文章站 2024-02-27 22:03:45
先说下我自己的理解,一般而言,json字符串要转为java对象需要自己写一个跟json一模一样的实体类bean,然后用bean.class作为参数传给对应的方法,实现转化成...

先说下我自己的理解,一般而言,json字符串要转为java对象需要自己写一个跟json一模一样的实体类bean,然后用bean.class作为参数传给对应的方法,实现转化成功。

上述这种方法太麻烦了。其实有一种东西叫jsonobject可以直接不用新建实体类bean,而实现转化,先说org.json.jsonobject这个jsonobject,贴上代码:

import java.beans.introspectionexception;
import java.beans.introspector;
import java.beans.propertydescriptor;
import java.util.arraylist;
import java.util.hashmap;
import java.util.iterator;
import java.util.list;
import java.util.map;
import java.util.set;

import org.json.jsonobject;

/**
* json工具类,实现了实体类和json数据格式之间的互转功能 使用实例:<br>
*/
public class jsonutils {
 /**
  * 将一个实体类对象转换成json数据格式
  * 
  * @param bean
  *   需要转换的实体类对象
  * @return 转换后的json格式字符串
  */
 private static string beantojson(object bean) {
  stringbuilder json = new stringbuilder();
  json.append("{");
  propertydescriptor[] props = null;
  try {
   props = introspector.getbeaninfo(bean.getclass(), object.class)
     .getpropertydescriptors();
  } catch (introspectionexception e) {
  }
  if (props != null) {
   for (int i = 0; i < props.length; i++) {
    try {
     string name = objtojson(props[i].getname());
     string value = objtojson(props[i].getreadmethod()
       .invoke(bean));
     json.append(name);
     json.append(":");
     json.append(value);
     json.append(",");
    } catch (exception e) {
    }
   }
   json.setcharat(json.length() - 1, '}');
  } else {
   json.append("}");
  }
  return json.tostring();
 }


 /**
  * 将一个list对象转换成json数据格式返回
  * 
  * @param list
  *   需要进行转换的list对象
  * @return 转换后的json数据格式字符串
  */
 private static string listtojson(list<?> list) {
  stringbuilder json = new stringbuilder();
  json.append("[");
  if (list != null && list.size() > 0) {
   for (object obj : list) {
    json.append(objtojson(obj));
    json.append(",");
   }
   json.setcharat(json.length() - 1, ']');
  } else {
   json.append("]");
  }
  return json.tostring();
 }

 /**
  * 将一个对象数组转换成json数据格式返回
  * 
  * @param array
  *   需要进行转换的数组对象
  * @return 转换后的json数据格式字符串
  */
 private static string arraytojson(object[] array) {
  stringbuilder json = new stringbuilder();
  json.append("[");
  if (array != null && array.length > 0) {
   for (object obj : array) {
    json.append(objtojson(obj));
    json.append(",");
   }
   json.setcharat(json.length() - 1, ']');
  } else {
   json.append("]");
  }
  return json.tostring();
 }

 /**
  * 将一个map对象转换成json数据格式返回
  * 
  * @param map
  *   需要进行转换的map对象
  * @return 转换后的json数据格式字符串
  */
 private static string maptojson(map<?, ?> map) {
  stringbuilder json = new stringbuilder();
  json.append("{");
  if (map != null && map.size() > 0) {
   for (object key : map.keyset()) {
    json.append(objtojson(key));
    json.append(":");
    json.append(objtojson(map.get(key)));
    json.append(",");
   }
   json.setcharat(json.length() - 1, '}');
  } else {
   json.append("}");
  }
  return json.tostring();
 }

 /**
  * 将一个set对象转换成json数据格式返回
  * 
  * @param set
  *   需要进行转换的set对象
  * @return 转换后的json数据格式字符串
  */
 private static string settojson(set<?> set) {
  stringbuilder json = new stringbuilder();
  json.append("[");
  if (set != null && set.size() > 0) {
   for (object obj : set) {
    json.append(objtojson(obj));
    json.append(",");
   }
   json.setcharat(json.length() - 1, ']');
  } else {
   json.append("]");
  }
  return json.tostring();
 }

 private static string stringtojson(string s) {
  if (s == null) {
   return "";
  }
  stringbuilder sb = new stringbuilder();
  for (int i = 0; i < s.length(); i++) {
   char ch = s.charat(i);
   switch (ch) {
   case '"':
    sb.append("\\\"");
    break;
   case '\\':
    sb.append("\\\\");
    break;
   case '\b':
    sb.append("\\b");
    break;
   case '\f':
    sb.append("\\f");
    break;
   case '\n':
    sb.append("\\n");
    break;
   case '\r':
    sb.append("\\r");
    break;
   case '\t':
    sb.append("\\t");
    break;
   case '/':
    sb.append("\\/");
    break;
   default:
    if (ch >= '\u0000' && ch <= '\u001f') {
     string ss = integer.tohexstring(ch);
     sb.append("\\u");
     for (int k = 0; k < 4 - ss.length(); k++) {
      sb.append('0');
     }
     sb.append(ss.touppercase());
    } else {
     sb.append(ch);
    }
   }
  }
  return sb.tostring();
 }

 public static string objtojson(object obj) {
  stringbuilder json = new stringbuilder();
  if (obj == null) {
   json.append("\"\"");
  } else if (obj instanceof number) {
   number num = (number)obj;
   json.append(num.tostring());
  } else if (obj instanceof boolean) {
   boolean bl = (boolean)obj;
   json.append(bl.tostring());
  } else if (obj instanceof string) {
   json.append("\"").append(stringtojson(obj.tostring())).append("\"");
  } else if (obj instanceof object[]) {
   json.append(arraytojson((object[]) obj));
  } else if (obj instanceof list) {
   json.append(listtojson((list) obj));
  } else if (obj instanceof map) {
   json.append(maptojson((map) obj));
  } else if (obj instanceof set) {
   json.append(settojson((set) obj));
  } else {
   json.append(beantojson(obj));
  }
  return json.tostring();
 }
 
 /**
  * @title: json2map
  * @creater: chencc <br>
  * @date: 2011-3-28 <br>
  * @description: todo转化json2map
  * @param @param jsonstring
  * @param @return
  * @return map<string,object>
  * @throws
  */
 @suppresswarnings("unchecked")
 public static map<string, object> json2map(string jsonstring) {
  
  map<string, object> map = new hashmap<string, object>();
  try {
   if(null != jsonstring && !"".equals(jsonstring)){
    jsonobject jsonobject = new jsonobject(jsonstring);
   
    iterator keyiter = jsonobject.keys();
    string key = "";
    object value = null;
   
    while (keyiter.hasnext()) {
     key = (string) keyiter.next();
     value = jsonobject.get(key);
     map.put(key, value);
    }
   }
  } catch (exception e) {
   e.printstacktrace();
  }
  return map;
 }
 
 //测试方法
 public static void main(string[] args) {
  map<string,object> params = new hashmap<string,object>();
  params.put("callid123", integer.valueof(1000));
  map retmap = new hashmap();
  retmap.put("params", params);
  retmap.put("result", true);
  list ls = new arraylist();
  ls.add(new hashmap());
  ls.add("hello world!!");
  ls.add(new string[4]);
  retmap.put("list", ls);
  
  string[] strarray = new string[10];
  strarray[1]="first";
  strarray[2]="2";
  strarray[3]="3";
  system.out.println("boolean:"+jsonutils.objtojson(true));
  system.out.println("number:"+jsonutils.objtojson(23.3));
  system.out.println("string:"+jsonutils.objtojson("sdhfsjdgksdlkjfk\"sd,!#%$^&*#(*@&*%&*$fsdfsdfsdf"));
  system.out.println("map :"+jsonutils.objtojson(retmap));
  system.out.println("list:"+jsonutils.objtojson(ls));
  system.out.println("array:"+jsonutils.objtojson(strarray));
  
  string json = jsonutils.objtojson(retmap);
  map r = jsonutils.json2map(json);
  system.out.println(r.get("callid123"));
  
  
 }
}

再来聊聊net.sf.json.jsonobject这个jsonobject,代码如下

import java.io.ioexception;
import java.text.simpledateformat;
import java.util.arraylist;
import java.util.hashmap;
import java.util.linkedhashmap;
import java.util.list;
import java.util.map;
import java.util.timezone;

import net.sf.json.jsonarray;
import net.sf.json.jsonobject;
import net.sf.json.jsonconfig;
import net.sf.json.util.cycledetectionstrategy;
import net.sf.json.util.propertyfilter;

import com.fasterxml.jackson.annotation.jsoninclude.include;
import com.fasterxml.jackson.databind.deserializationfeature;
import com.fasterxml.jackson.databind.objectmapper;

public class jsonutil {
 
 
 private static objectmapper objectmapper = null;
 /**
  * json初始化
  */
 static {
  objectmapper = new objectmapper(); 
  //设置为中国上海时区 
  objectmapper.settimezone(timezone.gettimezone("gmt+8")); 
  //空值不序列化 
  objectmapper.setserializationinclusion(include.non_null); 
  //反序列化时,属性不存在的兼容处理 
  objectmapper.getdeserializationconfig().withoutfeatures(deserializationfeature.fail_on_unknown_properties); 
  //序列化时,日期的统一格式 
  objectmapper.setdateformat(new simpledateformat("yyyy-mm-dd hh:mm:ss")); 

  objectmapper.configure(deserializationfeature.fail_on_unknown_properties, false); 
  
 } 
 
 
 /**
  * 把对象转换成为json字符串
  *
  * @param obj
  * @return
  */
 public static string convertobjecttojson(object obj) {
  if (obj == null) {
//    throw new illegalargumentexception("对象参数不能为空。");
   return null;
  }
  try {
   return objectmapper.writevalueasstring(obj);

  } catch (ioexception e) {
   e.printstacktrace();
  }
  return null;

 }
 /**
  * 把json字符串转成object对象
  * @param jsonstring
  * @return t
  */
 public static <t> t parsejsontoobject(string jsonstring, class<t> valuetype) {
  
  if(jsonstring == null || "".equals((jsonstring))){
   return null;
  }
  try {
   return objectmapper.readvalue(jsonstring, valuetype);
  } catch (exception e) {
   e.printstacktrace();
  }
  return null;
 }
 /**
  * 把json字符串转成list对象
  * @param jsonstring
  * @return list<t>
  */
 @suppresswarnings("unchecked")
 public static <t> list<t> parsejsontolist(string jsonstring,class<t> valuetype) {
  
  if(jsonstring == null || "".equals((jsonstring))){
   return null;
  }
  
  list<t> result = new arraylist<t>();
  try {
   list<linkedhashmap<object, object>> list = objectmapper.readvalue(jsonstring, list.class);
   
   for (linkedhashmap<object, object> map : list) {
    
    string jsonstr = convertobjecttojson(map);
    
    t t = parsejsontoobject(jsonstr, valuetype);
    
    result.add(t);
   }
  } catch (exception e) {
   e.printstacktrace();
  }
  return result;
 }
 /**
  * json处理含有嵌套关系对象,避免出现异常:net.sf.json.jsonexception: there is a cycle in the hierarchy的方法
  * 注意:这样获得到的字符串中,引起嵌套循环的属性会置为null
  *
  * @param obj
  * @return
  */
 public static jsonobject getjsonobject(object obj) {

  jsonconfig jsonconfig = new jsonconfig();
  jsonconfig.setcycledetectionstrategy(cycledetectionstrategy.lenient);
  jsonconfig.setjsonpropertyfilter(new propertyfilter() {
   
   @override
   public boolean apply(object source, string name, object value) {
    if(value==null){
     return true;
    }
    return false;
   }
  });
  return jsonobject.fromobject(obj, jsonconfig);
 }
 /**
  * json处理含有嵌套关系对象,避免出现异常:net.sf.json.jsonexception: there is a cycle in the hierarchy的方法

  * 注意:这样获得到的字符串中,引起嵌套循环的属性会置为null
  *
  * @param obj
  * @return
  */
 public static jsonarray getjsonarray(object obj) {

  jsonconfig jsonconfig = new jsonconfig();
  jsonconfig.setcycledetectionstrategy(cycledetectionstrategy.lenient);

  return jsonarray.fromobject(obj, jsonconfig);
 }
 /**
  * 解析json字符串成一个map
  *
  * @param jsonstr json字符串,格式如: {dicttable:"bm_xb",groupvalue:"分组值"}
  * @return
  */
 public static map<string, object> parsejsonstr(string jsonstr) {

  map<string, object> result = new hashmap<string, object>();

  jsonobject jsonobj = jsonutil.getjsonobject(jsonstr);

  for (object key : jsonobj.keyset()) {
   result.put((string) key, jsonobj.get(key));
  }
  return result;
 }

}

总结:net.sf.json.jsonobject这个属于json-lib这个老牌的系列,依赖的包超级多,commons的lang、logging、beanutils、collections等组件都有。

而org.json则相对来说依赖的包少一些,速度和性能方面没有怎么进行测试。

以上这篇基于json和java对象的互转方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。