|
|
@@ -0,0 +1,168 @@
|
|
|
+package com.xunmei.common.core.utils;
|
|
|
+
|
|
|
+import com.fasterxml.jackson.annotation.JsonInclude;
|
|
|
+import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
+import com.fasterxml.jackson.core.type.TypeReference;
|
|
|
+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 com.fasterxml.jackson.databind.node.ArrayNode;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
|
+import java.io.File;
|
|
|
+import java.io.IOException;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author jingyuanchao
|
|
|
+ * @date 2024/2/27 14:27
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+public class JacksonUtils {
|
|
|
+
|
|
|
+
|
|
|
+ private static ObjectMapper objectMapper = new ObjectMapper();
|
|
|
+
|
|
|
+ // 时间日期格式
|
|
|
+ private static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss";
|
|
|
+
|
|
|
+ //以静态代码块初始化
|
|
|
+ static {
|
|
|
+ //对象的所有字段全部列入序列化
|
|
|
+ objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
|
|
|
+ //取消默认转换timestamps形式
|
|
|
+ objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
|
|
|
+ //忽略空Bean转json的错误
|
|
|
+ objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
|
|
|
+ //所有的日期格式都统一为以下的格式,即yyyy-MM-dd HH:mm:ss
|
|
|
+ objectMapper.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT));
|
|
|
+ //忽略 在json字符串中存在,但在java对象中不存在对应属性的情况。防止错误
|
|
|
+ objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**===========================以下是从JSON中获取对象====================================*/
|
|
|
+ public static <T> T parseObject(String jsonString, Class<T> object) {
|
|
|
+ T t = null;
|
|
|
+ try {
|
|
|
+ t = objectMapper.readValue(jsonString, object);
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ log.error("JsonString转为自定义对象失败:{}", e.getMessage());
|
|
|
+ }
|
|
|
+ return t;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static <T> T parseObject(File file, Class<T> object) {
|
|
|
+ T t = null;
|
|
|
+ try {
|
|
|
+ t = objectMapper.readValue(file, object);
|
|
|
+ } catch (IOException e) {
|
|
|
+ log.error("从文件中读取json字符串转为自定义对象失败:{}", e.getMessage());
|
|
|
+ }
|
|
|
+ return t;
|
|
|
+ }
|
|
|
+
|
|
|
+ //将json数组字符串转为指定对象List列表或者Map集合
|
|
|
+ public static <T> T parseJSONArray(String jsonArray, TypeReference<T> reference) {
|
|
|
+ T t = null;
|
|
|
+ try {
|
|
|
+ t = objectMapper.readValue(jsonArray, reference);
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ log.error("JSONArray转为List列表或者Map集合失败:{}", e.getMessage());
|
|
|
+ }
|
|
|
+ return t;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**=================================以下是将对象转为JSON=====================================*/
|
|
|
+ public static String toJSONString(Object object) {
|
|
|
+ String jsonString = null;
|
|
|
+ try {
|
|
|
+ jsonString = objectMapper.writeValueAsString(object);
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ log.error("Object转JSONString失败:{}", e.getMessage());
|
|
|
+ }
|
|
|
+ return jsonString;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static byte[] toByteArray(Object object) {
|
|
|
+ byte[] bytes = null;
|
|
|
+ try {
|
|
|
+ bytes = objectMapper.writeValueAsBytes(object);
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ log.error("Object转ByteArray失败:{}", e.getMessage());
|
|
|
+ }
|
|
|
+ return bytes;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void objectToFile(File file, Object object) {
|
|
|
+ try {
|
|
|
+ objectMapper.writeValue(file, object);
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ log.error("Object写入文件失败:{}", e.getMessage());
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**=============================以下是与JsonNode相关的=======================================*/
|
|
|
+ //JsonNode和JSONObject一样,都是JSON树形模型,只不过在jackson中,存在的是JsonNode
|
|
|
+ public static JsonNode parseJSONObject(String jsonString) {
|
|
|
+ JsonNode jsonNode = null;
|
|
|
+ try {
|
|
|
+ jsonNode = objectMapper.readTree(jsonString);
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ log.error("JSONString转为JsonNode失败:{}", e.getMessage());
|
|
|
+ }
|
|
|
+ return jsonNode;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static JsonNode parseJSONObject(Object object) {
|
|
|
+ JsonNode jsonNode = objectMapper.valueToTree(object);
|
|
|
+ return jsonNode;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String toJSONString(JsonNode jsonNode) {
|
|
|
+ String jsonString = null;
|
|
|
+ try {
|
|
|
+ jsonString = objectMapper.writeValueAsString(jsonNode);
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ log.error("JsonNode转JSONString失败:{}", e.getMessage());
|
|
|
+ }
|
|
|
+ return jsonString;
|
|
|
+ }
|
|
|
+
|
|
|
+ //JsonNode是一个抽象类,不能实例化,创建JSON树形模型,得用JsonNode的子类ObjectNode,用法和JSONObject大同小异
|
|
|
+ public static ObjectNode newJSONObject() {
|
|
|
+ return objectMapper.createObjectNode();
|
|
|
+ }
|
|
|
+
|
|
|
+ //创建JSON数组对象,就像JSONArray一样用
|
|
|
+ public static ArrayNode newJSONArray() {
|
|
|
+ return objectMapper.createArrayNode();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**===========以下是从JsonNode对象中获取key值的方法,个人觉得有点多余,直接用JsonNode自带的取值方法会好点,出于纠结症,还是补充进来了*/
|
|
|
+ public static String getString(JsonNode jsonObject, String key) {
|
|
|
+ String s = jsonObject.get(key).asText();
|
|
|
+ return s;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Integer getInteger(JsonNode jsonObject, String key) {
|
|
|
+ Integer i = jsonObject.get(key).asInt();
|
|
|
+ return i;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Boolean getBoolean(JsonNode jsonObject, String key) {
|
|
|
+ Boolean bool = jsonObject.get(key).asBoolean();
|
|
|
+ return bool;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static JsonNode getJSONObject(JsonNode jsonObject, String key) {
|
|
|
+ JsonNode json = jsonObject.get(key);
|
|
|
+ return json;
|
|
|
+ }
|
|
|
+}
|