全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

先说下我自己的理解,一般而言,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对象的互转方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# JSON和java对象互转  # java中常用的json  # jsonarray  # map数据结构与对象互转详解  # Java中对象 和 json 互转四种方式 json-lib、Gson、FastJson、Jacks  # java中json和对象之间相互转换的运用  # JAVA中JSONObject对象和Map对象之间的相互转换  # Java实现Json字符串与Object对象相互转换的方式总结  # 详谈Java中net.sf.json包关于JSON与对象互转的坑  # java对象与json对象间的相互转换的方法  # java中实体类和JSON对象之间相互转化  # Java中Json字符串和Java对象的互转  # 数据格式  # 转换成  # 实体类  # 给大家  # 序列化  # 先说  # 转成  # 自己的  # 都有  # 有一种  # 希望能  # 再来  # 不存在  # 可以直接  # 这篇  # 设置为  # 贴上  # 小编  # 大家多多  # 中国上海 


相关文章: 头像制作网站在线制作软件,dw网页背景图像怎么设置?  如何在服务器上配置二级域名建站?  详解jQuery停止动画——stop()方法的使用  黑客入侵网站服务器的常见手法有哪些?  建站之星如何保障用户数据免受黑客入侵?  电商平台网站制作流程,电商网站如何制作?  中山网站推广排名,中山信息港登录入口?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  建站之星如何配置系统实现高效建站?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  C#怎么使用委托和事件 C# delegate与event编程方法  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  视频网站制作教程,怎么样制作优酷网的小视频?  如何实现建站之星域名转发设置?  昆明高端网站制作公司,昆明公租房申请网上登录入口?  建站之星导航如何优化提升用户体验?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何在IIS7上新建站点并设置安全权限?  济南企业网站制作公司,济南社保单位网上缴费步骤?  如何通过可视化优化提升建站效果?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  如何用花生壳三步快速搭建专属网站?  如何快速生成凡客建站的专业级图册?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  如何快速搭建个人网站并优化SEO?  如何通过虚拟主机空间快速建站?  如何在建站宝盒中设置产品搜索功能?  香港服务器部署网站为何提示未备案?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  如何快速搭建安全的FTP站点?  如何使用Golang table-driven基准测试_多组数据测量函数效率  建站三合一如何选?哪家性价比更高?  如何通过商城免费建站系统源码自定义网站主题?  网站制作公司排行榜,抖音怎样做个人官方网站  怀化网站制作公司,怀化新生儿上户网上办理流程?  广平建站公司哪家专业可靠?如何选择?  如何在香港服务器上快速搭建免备案网站?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  建站主机是否等同于虚拟主机?  建站之星如何实现PC+手机+微信网站五合一建站?  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  如何高效完成独享虚拟主机建站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。