全网整合营销服务商

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

免费咨询热线: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对象的互转  # 数据格式  # 转换成  # 实体类  # 给大家  # 序列化  # 先说  # 转成  # 自己的  # 都有  # 有一种  # 希望能  # 再来  # 不存在  # 可以直接  # 这篇  # 设置为  # 贴上  # 小编  # 大家多多  # 中国上海 


相关文章: 实现点击下箭头变上箭头来回切换的两种方法【推荐】  零基础网站服务器架设实战:轻量应用与域名解析配置指南  昆明网站制作哪家好,昆明公租房申请网上登录入口?  教程网站设计制作软件,怎么创建自己的一个网站?  湖北网站制作公司有哪些,湖北清能集团官网?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  深圳网站制作培训,深圳哪些招聘网站比较好?  建站之星代理如何获取技术支持?  在线制作视频网站免费,都有哪些好的动漫网站?  免费网站制作appp,免费制作app哪个平台好?  寿县云建站:智能SEO优化与多行业模板快速上线指南  如何通过老薛主机一键快速建站?  如何通过商城自助建站源码实现零基础高效建站?  建站168自助建站系统:快速模板定制与SEO优化指南  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  一键网站制作软件,义乌购一件代发流程?  MySQL查询结果复制到新表的方法(更新、插入)  建站之星多图banner生成与模板自定义指南  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  建站之星导航菜单设置与功能模块配置全攻略  网站制作新手教程,新手建设一个网站需要注意些什么?  建站之星如何实现PC+手机+微信网站五合一建站?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  如何在橙子建站上传落地页?操作指南详解  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  如何通过万网虚拟主机快速搭建网站?  如何安全更换建站之星模板并保留数据?  专业商城网站制作公司有哪些,pi商城官网是哪个?  如何在云主机上快速搭建多站点网站?  如何快速搭建FTP站点实现文件共享?  家庭服务器如何搭建个人网站?  怎么将XML数据可视化 D3.js加载XML  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  建站DNS解析失败?如何正确配置域名服务器?  盐城做公司网站,江苏电子版退休证办理流程?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  宝塔面板如何快速创建新站点?  Android自定义控件实现温度旋转按钮效果  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何通过WDCP绑定主域名及创建子域名站点?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  Android滚轮选择时间控件使用详解  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  如何获取开源自助建站系统免费下载链接?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  如何在云服务器上快速搭建个人网站?  实惠建站价格推荐:2025年高性价比自助建站套餐解析  建站之星如何一键生成手机站? 

您的项目需求

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