package com.lunhan.xxx.common.util; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.dataformat.xml.PackageVersion; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.lunhan.xxx.common.serializer.*; import com.lunhan.xxx.common.serializer.deserializer.*; import java.io.IOException; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; /** * json/XML处理类 * @author linliu * @date 2018-12-28 */ public final class SerializeUtil { private SerializeUtil() { throw new IllegalStateException("Utility class"); } //region 字符串常量 private static final String TITLE = "SerializeUtil"; //endregion private static final ObjectMapper JSON_MAPPER = new ObjectMapper(); private static final XmlMapper XML_MAPPER = new XmlMapper(); static { //忽略字段大小写 XML_MAPPER.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); //忽略字段数量不一致 XML_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //默认json序列化设置 SerializeUtil.initSerializationConfigure(JSON_MAPPER); } /** * 默认json序列化设置 * @param JSON_MAPPER mapper实例 */ private static void initSerializationConfigure(ObjectMapper JSON_MAPPER) { //忽略字段大小写 JSON_MAPPER.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); //此配置反序列化的时候如果多了属性, 不抛出异常。不设置这个json字符串只能少属性,不能多属性,否者会抛异常 JSON_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //如果是空对象的时候,不抛异常 JSON_MAPPER.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); //******************************* 处理日期类型序列化和反序列化 ******************************* //取消时间的转化格式,默认是时间戳,可以取消,同时需要设置要表现的时间格式 JSON_MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); SimpleModule serializerModule = new SimpleModule("CQDateTimeSerializer", PackageVersion.VERSION); serializerModule.addSerializer(Date.class, new CQDateSerializer()); serializerModule.addDeserializer(Date.class, new CQDateDeSerializer()); serializerModule.addSerializer(Calendar.class, new CQCalendarSerializer()); serializerModule.addDeserializer(Calendar.class, new CQCalendarDeSerializer()); serializerModule.addSerializer(LocalDate.class, new CQLocalDateSerializer()); serializerModule.addDeserializer(LocalDate.class, new CQLocalDateDeSerializer()); serializerModule.addSerializer(LocalDateTime.class, new CQLocalDateTimeSerializer()); serializerModule.addDeserializer(LocalDateTime.class, new CQLocalDateTimeDeSerializer()); serializerModule.addSerializer(Timestamp.class, new CQTimestampSerializer()); serializerModule.addDeserializer(Timestamp.class, new CQTimestampDeSerializer()); JSON_MAPPER.registerModule(serializerModule); //******************************* 处理日期类型序列化和反序列化 ******************************* /* //序列化的时候序列对象的所有属性 JSON_MAPPER.setSerializationInclusion(JsonInclude.Include.ALWAYS); */ } /** * json字符串转 T 类型实体 * @param json json字符串 * @param clazz 实体类型 * @param 实体类型 */ public static T toObject(String json, Class clazz) { if(StringUtil.isNullOrEmpty(json)){ return null; } try { if(Objects.equals(clazz, JsonObject.class)) { JsonParser jsonParser = new JsonParser(); return (T)jsonParser.parse(json).getAsJsonObject(); } return JSON_MAPPER.readValue(json, clazz); } catch (IOException e) { //TODO log throw new RuntimeException(e); } } /** * json字符串转 List→T 类型集合 * @param json json字符串 * @param clazz 实体类型 * @param 实体类型 */ public static List toListObject(String json, Class clazz){ if(StringUtil.isNullOrEmpty(json)){ return new ArrayList<>(); } try{ //这种返回的是List //return JSON_MAPPER.readValue(json, new TypeReference>() {}); return SerializeUtil.toObject(json, List.class, clazz); } catch (Exception e) { //TODO log throw new RuntimeException(e); } } /** * json字符串转 T 类型实体 * @param json json字符串 * @param genericClass 实体类型 * @param clazz 实体类型 * @param 实体类型 */ public static T toObject(String json, Class genericClass, Class clazz) { if(StringUtil.isNullOrEmpty(json)){ return null; } try { JavaType type = JSON_MAPPER.getTypeFactory().constructParametricType(genericClass, clazz); return JSON_MAPPER.readValue(json, type); } catch (IOException e) { //TODO log throw new RuntimeException(e); } } public static String toJson(Object obj) { if(obj==null){ return null; } try { if(obj instanceof JsonObject || obj instanceof JsonArray) { return obj.toString(); } else { return JSON_MAPPER.writeValueAsString(obj); } } catch (Exception e) { //TODO log throw new RuntimeException(e); } } public static String toJsonWithoutNull(Object obj) { if(obj==null){ return null; } try { if (obj instanceof JsonObject || obj instanceof JsonArray) { return obj.toString(); } else { ObjectMapper mapper = new ObjectMapper(); //默认json序列化设置 SerializeUtil.initSerializationConfigure(mapper); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); return mapper.writeValueAsString(obj); } } catch (Exception e) { //TODO log throw new RuntimeException(e); } } public static String toCSharpJson(Object obj) { if(obj==null){ return null; } try { if (obj instanceof JsonObject || obj instanceof JsonArray) { return obj.toString(); } else { ObjectMapper mapper = new ObjectMapper(); //默认json序列化设置 SerializeUtil.initSerializationConfigure(mapper); // deprecated mapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES); mapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE); return mapper.writeValueAsString(obj); } } catch (Exception e) { //TODO log throw new RuntimeException(e); } } public static String toJson(Object obj, String dateFormat) { if(obj==null){ return null; } try { if (obj instanceof JsonObject || obj instanceof JsonArray) { return obj.toString(); } else { ObjectMapper mapper = new ObjectMapper(); //默认json序列化设置 SerializeUtil.initSerializationConfigure(mapper); mapper.setDateFormat(new SimpleDateFormat(dateFormat)); return mapper.writeValueAsString(obj); } } catch (Exception e) { //TODO log throw new RuntimeException(e); } } public static T fromXml(String xml, Class clazz) { if(StringUtil.isNullOrEmpty(xml)){ return null; } try { return XML_MAPPER.readValue(xml, clazz); } catch (Exception e) { //TODO log throw new RuntimeException(e); } } public static T fromXml(String xml, Class genericClass, Class clazz) { if(StringUtil.isNullOrEmpty(xml)){ return null; } try { JavaType type = XML_MAPPER.getTypeFactory().constructParametricType(genericClass, clazz); return XML_MAPPER.readValue(xml, type); } catch (Exception e) { //TODO log throw new RuntimeException(e); } } public static String toXml(Object obj) { if(obj == null){ return ""; } try{ return XML_MAPPER.writeValueAsString(obj); } catch (Exception e) { //TODO log throw new RuntimeException(e); } } public static JsonObject toJSONObject(Object obj) { if(null==obj) { return null; } try { String json = new Gson().toJson(obj); return new JsonParser().parse(json).getAsJsonObject(); } catch (Exception e) { //TODO log throw new RuntimeException(e); } } }