import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONPath; import com.whtr.bdci.rcbd.frame.utils.Reflections; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; /** * @author * @version V1.0 * @since * @Description 类说明:JSON序列化工具(描述:使用FastJson+Jackson注解功能支持) */ public class JsonTransformUtil { private static Logger LOGGER = LoggerFactory.getLogger(JsonTransformUtil.class); /** * JSON中特定转化POJO * * @param jsonData * JSON格工字符串 * * @param jsonPath * 获取指定节点路径为空使用当前节点 * * @param clazz * 序列化类 */ @SuppressWarnings("unchecked") public static <T> T jsonToBeanByPath(String jsonData, String jsonPath, Class<T> clazz) { T result = null; if (StringUtils.isNotEmpty(jsonData)) { String jsonStr = null; if (StringUtils.isNotEmpty(jsonPath)) { JSONObject jsonRoot = JSON.parseObject(jsonData); Object object = JSONPath.eval(jsonRoot, jsonPath); if (object instanceof String) { return (T) object; } else if (object instanceof BigDecimal) { // Number Type Default Serialize if (clazz.isAssignableFrom(Double.class)) { Double objVal = ((BigDecimal) object).doubleValue(); return (T) objVal; } else if (clazz.isAssignableFrom(Float.class)) { Float objVal = ((BigDecimal) object).floatValue(); return (T) objVal; } else { return (T) object; } } else if (clazz.isAssignableFrom(Integer.class) || clazz.isAssignableFrom(Long.class) || object instanceof Double) { return (T) object; } else if (object instanceof JSONArray) { return (T) object; } else if (clazz.isAssignableFrom(JSONObject.class)) { return (T) object; } // 适配实际值对象与泛型不匹配 if ((object instanceof Integer || object instanceof Long || object instanceof Double) && clazz.isAssignableFrom(BigDecimal.class)) { return (T) (new BigDecimal(object.toString())); } JSONObject jsonSingle = (JSONObject) object; if (jsonSingle != null) { jsonStr = jsonSingle.toJSONString(); } } else { jsonStr = jsonData; } result = JsonMapper.getInstance().fromJson(jsonStr, clazz); if (null == result && LOGGER.isDebugEnabled()) { LOGGER.debug("deserialize result null.jsonData:" + jsonData + " josnPath:" + jsonPath); } } return result; } /** 通用JSONArray转List对象 */ public static <T> List<T> jsonToBeanByPath(JSONObject jsonObject, String jsonPath, Class<T> clazz) { List<T> resultList = new ArrayList<T>(); JSONArray jsonArray = (JSONArray) JSONPath.eval(jsonObject, jsonPath); if (null != jsonArray && !jsonArray.isEmpty()) { for (int i = 0; i < jsonArray.size(); i++) { JSONObject jsonSingle = jsonArray.getJSONObject(i); T result = JsonMapper.getInstance().fromJson(jsonSingle.toJSONString(), clazz); if (null == result) { if (LOGGER.isDebugEnabled()) LOGGER.debug("deserialize result null.jsonData:" + jsonObject.toJSONString() + " detailObj:" + jsonSingle.toJSONString()); continue; } resultList.add(result); } } return resultList; } /** 通用JSONArray转List对象,附加定制属性拷贝 */ public static <T> List<T> jsonToBeanByPath(JSONObject jsonObject, String josnPath, Class<T> clazz, String idCard, Long origId) { List<T> resultList = new ArrayList<T>(); JSONArray jsonArray = (JSONArray) JSONPath.eval(jsonObject, josnPath); if (null != jsonArray && !jsonArray.isEmpty()) { for (int i = 0; i < jsonArray.size(); i++) { JSONObject detailObj = jsonArray.getJSONObject(i); T result = JsonMapper.getInstance().fromJson(detailObj.toJSONString(), clazz); if (null == result && LOGGER.isDebugEnabled()) { LOGGER.debug("deserialize result null.jsonData:" + jsonObject.toJSONString() + " detailObj:" + detailObj.toJSONString()); continue; } copyBeanProp(result, idCard, origId); resultList.add(result); } } return resultList; } /** 通用属性拷贝 */ public static <T> void copyBeanProp(List<T> beanList, String idCard, Long origId) { if (null != beanList) { for (T result : beanList) { copyBeanProp(result, idCard, origId); } } } public static <T> void copyBeanProp(T result, String idCard, Long origId) { Reflections.invokeSetter(result, "idCard", idCard); Reflections.invokeSetter(result, "origId", origId); } }
JSON序列化工具
最新推荐文章于 2024-08-29 07:46:48 发布