package com.chengxuhai.log.util;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.databind.type.CollectionType;
import com.fasterxml.jackson.databind.type.TypeFactory;
import lombok.SneakyThrows;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.List;
/**
* Json工具类
* 一个基于com.fasterxml.jackson封装的Json常用工具类
* @author: 程序海
* @date: 2023-05-31 10:23
* @email: 321766212@qq.com
* @blog: http://www.chengxuhai.com
*/
public class JsonUtils {
private static final ObjectMapper objectMapper;
static {
objectMapper = new ObjectMapper();
//configure方法 配置一些需要的参数
// 转换为格式化的json 显示出来的格式美化
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
//序列化的时候序列对象的那些属性 Java对象为空的字段不拼接JSON
//JsonInclude.Include.NON_DEFAULT 属性为默认值不序列化
//JsonInclude.Include.ALWAYS 所有属性
//JsonInclude.Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
//JsonInclude.Include.NON_NULL 属性为NULL 不序列化
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
// 序列化:序列化BigDecimal时不使用科学计数法输出
objectMapper.configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true);
//反序列化时,遇到未知属性会不会报错
//true - 遇到没有的属性就报错 false - 没有的属性不会管,不会报错
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//如果是空对象的时候,不抛异常
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// 忽略 transient 修饰的属性
objectMapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);
// 反序列化:不允许基本类型为null
objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, true);
//修改序列化后日期格式
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//处理不同的时区偏移格式
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
// objectMapper.registerModule(new JavaTimeModule());
// objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
}
/**
* json转对象
* @param json
* @param clazz
* @return
* @param <T>
*/
public static <T> T toObject(String json,Class<T> clazz){
try {
return objectMapper.readValue(json, clazz);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
/**
* json转对象
* @param object
* @param typeReference
* @return
* @param <T>
*/
@SneakyThrows
public static <T> T convertValue(Object object, TypeReference<T> typeReference){
return objectMapper.convertValue(object, typeReference);
}
/**
* 对象转json
* @param obj
* @return
*/
public static String toJson(Object obj){
try {
return objectMapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
/**
* json转集合
* 这样写就不用传一个TypeReference<List<T>> typeReference这么麻烦了
* @param json
* @param clazz 集合的泛型class
* @return
* @param <T>
*/
public static <T> List<T> toList(String json, Class<T> clazz) {
try {
if (json == null) {
return Collections.emptyList();
}
TypeFactory typeFactory = objectMapper.getTypeFactory();
CollectionType collectionType = typeFactory.constructCollectionType(List.class, clazz);
return objectMapper.readValue(json, collectionType);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 转换成Json节点
* @param
* @return
*/
public static JsonNode toTree(String json) {
try {
return objectMapper.readTree(json);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
/**
* 读取json文件,返回json串
* @param fileName
* @return
*/
public static String readJsonFile(String fileName) {
String jsonStr = "";
try {
File jsonFile = new File(fileName);
FileReader fileReader = new FileReader(jsonFile);
Reader reader = new InputStreamReader(new FileInputStream(jsonFile),"utf-8");
int ch = 0;
StringBuffer sb = new StringBuffer();
while ((ch = reader.read()) != -1) {
sb.append((char) ch);
}
fileReader.close();
reader.close();
jsonStr = sb.toString();
return jsonStr;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
String s = readJsonFile("C:\\Users\\chengxuhai\\moqu\\historyData\\2023110910_C2C.json");
System.out.println(s);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Spring AOP实战 记录日志 下载可以直接使用
共15个文件
java:10个
xml:3个
yml:1个
需积分: 0 2 下载量 27 浏览量
2024-01-05
10:33:32
上传
评论 1
收藏 14KB ZIP 举报
温馨提示
内容概要: 充分利用SpringBoot AOP设计的精妙日志记录方案,实现高效的日志处理策略。此外,我们还支持通过配置文件(yml)精准控制日志开关,并定制AOP切点表达式(Pointcut)。 适用人群: 针对资深Java开发者、熟悉Spring AOP的专业人士,以及企业中从事Java后端开发的工作人员。也欢迎对AOP实战用法感兴趣的同学们加入。 使用场景及目标: 在生产环境中,通过巧妙的AOP机制,实现对日志的细致记录和处理。我们的目标是提高日志记录的效率和规范性,为监控和故障排查提供更为轻松便捷的工具。 其他说明: 这一方法极为便捷,不仅简化了日志记录流程,更使得代码更加清晰易懂。为了满足个性化需求,我们提供了通过配置文件精准控制切点规则、随时开启或关闭日志功能的选项。在生产环境中,通过执行这一统一的日志处理策略,我们的最终目标是提高系统的稳定性和可维护性,确保业务的顺畅运行。
资源推荐
资源详情
资源评论
收起资源包目录
springboot-log-demo.zip (15个子文件)
springboot-log-demo
pom.xml 2KB
src
test
java
com
chengxuhai
log
SpringBootLogDemoApplicationTests.java 230B
main
resources
logback
logback-prod.xml 2KB
logback-dev.xml 732B
application.yml 136B
java
com
chengxuhai
log
SpringBootLogDemoApplication.java 415B
aspect
GreetingAdvice.java 4KB
controller
DemoController.java 567B
anno
Log.java 417B
service
SaveLogService.java 366B
util
HttpContextHolder.java 2KB
JsonUtils.java 6KB
config
GreetingDynamicPointcut.java 344B
LogAspectConfig.java 2KB
.gitignore 395B
共 15 条
- 1
资源评论
一个有梦的程序海
- 粉丝: 5
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功