/* * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. * * https://www.mall4j.com/ * * 未经允许,不可做商业用途! * * 版权所有,侵权必究! */ package com.yami.trading.common.util; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import lombok.extern.slf4j.Slf4j; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.TimeZone; @Slf4j public class Json { private static ObjectMapper objectMapper = new ObjectMapper(); static { // 是否缩放排列输出,默认false,有些场合为了便于排版阅读则需要对输出做缩放排列 // objectMapper.enable(SerializationFeature.INDENT_OUTPUT); // 序列化日期时以timestamps输出,默认true // objectMapper.enable(SerializationFeature.INDENT_OUTPUT); // 序列化枚举是以toString()来输出,默认false,即默认以name()来输出 如:ENUM01("enum_01") 默认为 ENUM01,true则为enum_01 // objectMapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); // 序列化枚举是以ordinal()来输出,默认false 如:ENUM01("enum_01") 默认为 ENUM01,true则为 0 非常危险 // objectMapper.enable(SerializationFeature.WRITE_ENUMS_USING_INDEX); // 序列化Map时对key进行排序操作,默认false // objectMapper.enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS); // 序列化char[]时以json数组输出,默认false //objectMapper.enable(SerializationFeature.WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS); //序列化BigDecimal时之间输出原始数字还是科学计数,默认false,即是否以toPlainString()科学计数方式来输出 // 1E+20 -> 100000000000000000000 // objectMapper.enable(Feature.WRITE_BIGDECIMAL_AS_PLAIN); objectMapper.setTimeZone(TimeZone.getDefault());//.getTimeZone("GMT+8") // 如果为空则不输出 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); // 对于空的对象转json的时候不抛出错误 objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); // 禁用序列化日期为timestamps objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // 禁用遇到未知属性抛出异常 objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); // 视空字符传为null // objectMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); // 低层级配置 // objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true); // 允许属性名称没有引号 // objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); // 允许单引号 // objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); // 取消对非ASCII字符的转码 objectMapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, false); } /** * 对象转json * @param object * @return */ public static String toJsonString(Object object) { try { return objectMapper.writeValueAsString(object); } catch (JsonProcessingException e) { log.error("对象转json错误:", e); } return null; } /** * json转换换成对象 * @param json * @param clazz * @return */ public static T parseObject(String json, Class clazz) { T result = null; try { result = objectMapper.readValue(json, clazz); } catch (Exception e) { log.error("对象转json错误:", e); } return result; } public static ObjectMapper getObjectMapper() { return objectMapper; } /** * * https://stackoverflow.com/questions/6349421/how-to-use-jackson-to-deserialise-an-array-of-objects * * List myObjects = Arrays.asList(mapper.readValue(json, MyClass[].class)) * * works up to 10 time faster than TypeRefence. * @return */ public static List parseArray(String json, Class clazz){ T[] result = null; try { result = objectMapper.readValue(json, clazz); } catch (Exception e) { log.error("Json转换错误:", e); } if (result == null) { return Collections.emptyList(); } return Arrays.asList(result); } /** * 转换成json节点,即map * @param jsonStr * @return */ public static JsonNode parseJson(String jsonStr) { JsonNode jsonNode = null; try { jsonNode = objectMapper.readTree(jsonStr); } catch (Exception e) { log.error("Json转换错误:", e); } return jsonNode; } }