《SpringBoot篇》26

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


![在这里插入图片描述](https://img-blog.csdnimg.cn/702f0510705d448b8132b497d35dec67.png)


### 3.配置文件


#### a.配置文件配置


properties格式:



#指定日期格式,比如yyyy-MM-dd HH:mm:ss,或者具体的格式化类的全限定名
spring.jackson.date-format
#指定日期格式化时区,比如America/Los_Angeles或者GMT+10.
spring.jackson.time-zone
#是否开启Jackson的反序列化
spring.jackson.deserialization
#是否开启json的generators.
spring.jackson.generator
#指定Joda date/time的格式,比如yyyy-MM-ddHH:mm:ss). 如果没有配置的话,dateformat会作为backup
spring.jackson.joda-date-time-format
#指定json使用的Locale.
spring.jackson.locale
#是否开启Jackson通用的特性.
spring.jackson.mapper
#是否开启jackson的parser特性.
spring.jackson.parser
#指定PropertyNamingStrategy(CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES)或者指定PropertyNamingStrategy子类的全限定类名.
spring.jackson.property-naming-strategy
#是否开启jackson的序列化.
spring.jackson.serialization
#指定序列化时属性的inclusion方式,具体查看JsonInclude.Include枚举.
spring.jackson.serialization-inclusion


yml格式:



spring:
jackson:
#日期格式化
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
#设置空如何序列化
default-property-inclusion: non_null
serialization:
#格式化输出
indent_output: true
#忽略无法转换的对象
fail_on_empty_beans: false
deserialization:
#允许对象忽略json中不存在的属性
fail_on_unknown_properties: false
parser:
#允许出现特殊字符和转义符
allow_unquoted_control_chars: true
#允许出现单引号
allow_single_quotes: true


#### b.自定义配置


**说明:** 这里直接将Jackson工具类给大家,自定义配置指的就是工具类中,对于object\_mapper的set赋值。什么方法都有,演示也直接使用工具类进行。



package com.clllb.jackson.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.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;

@Slf4j
public class JacksonUtil {

private static final ObjectMapper OBJECT\_MAPPER = new ObjectMapper();

private static final ObjectMapper OBJECT\_MAPPER\_SNAKE\_CASE = new ObjectMapper();
// 日期格式化
private static final String STANDARD\_FORMAT = "yyyy-MM-dd HH:mm:ss";

static {
    //对象的所有字段全部列入
    OBJECT\_MAPPER.setSerializationInclusion(JsonInclude.Include.ALWAYS);
    //取消默认转换timestamps形式
    OBJECT\_MAPPER.configure(SerializationFeature.WRITE\_DATES\_AS\_TIMESTAMPS, false);
    //忽略空Bean转json的错误
    OBJECT\_MAPPER.configure(SerializationFeature.FAIL\_ON\_EMPTY\_BEANS, false);
    //所有的日期格式都统一为以下的样式,即yyyy-MM-dd HH:mm:ss
    OBJECT\_MAPPER.setDateFormat(new SimpleDateFormat(STANDARD\_FORMAT));
    //忽略 在json字符串中存在,但是在java对象中不存在对应属性的情况。防止错误
    OBJECT\_MAPPER.configure(DeserializationFeature.FAIL\_ON\_UNKNOWN\_PROPERTIES, false);
}

static {
    //对象的所有字段全部列入
    OBJECT\_MAPPER\_SNAKE\_CASE.setSerializationInclusion(JsonInclude.Include.ALWAYS);
    //取消默认转换timestamps形式
    OBJECT\_MAPPER\_SNAKE\_CASE.configure(SerializationFeature.WRITE\_DATES\_AS\_TIMESTAMPS, false);
    //忽略空Bean转json的错误
    OBJECT\_MAPPER\_SNAKE\_CASE.configure(SerializationFeature.FAIL\_ON\_EMPTY\_BEANS, false);
    //所有的日期格式都统一为以下的样式,即yyyy-MM-dd HH:mm:ss
    OBJECT\_MAPPER\_SNAKE\_CASE.setDateFormat(new SimpleDateFormat(STANDARD\_FORMAT));
    //忽略 在json字符串中存在,但是在java对象中不存在对应属性的情况。防止错误
    OBJECT\_MAPPER\_SNAKE\_CASE.configure(DeserializationFeature.FAIL\_ON\_UNKNOWN\_PROPERTIES, false);
    //转换为下划线
    OBJECT\_MAPPER\_SNAKE\_CASE.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE\_CASE);
}

private JacksonUtil() {
}

/\*\*

* 对象转Json格式字符串
*
* @param obj 对象
* @return Json格式字符串
*/
public static String obj2String(T obj) {
if (obj == null) {
return null;
}
try {
return obj instanceof String ? (String) obj : OBJECT_MAPPER.writeValueAsString(obj);
} catch (JsonProcessingException e) {
log.warn(“Parse Object to String error : {}”, e.getMessage());
return null;
}
}

/\*\*

* 对象转file
* @param fileName
* @param obj
*/
public static void obj2File(String fileName,Object obj){
if (obj == null){
return;
}
try {
OBJECT_MAPPER.writeValue(new File(fileName),obj);
} catch (IOException e) {
e.printStackTrace();
}
}

/\*\*

* 对象转Json格式字符串; 属性名从驼峰改为下划线形式
*
* @param obj 对象
* @return Json格式字符串
*/
public static String obj2StringFieldSnakeCase(T obj) {
if (obj == null) {
return null;
}
try {
ObjectMapper objectMapper = OBJECT_MAPPER_SNAKE_CASE;
return obj instanceof String ? (String) obj : objectMapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
log.warn(“Parse Object to String error : {}”, e.getMessage());
return null;
}
}

/\*\*

* 字符串转换为自定义对象; 属性名从下划线形式改为驼峰
*
* @param str 要转换的字符串
* @param clazz 自定义对象的class对象
* @return 自定义对象
*/
public static T string2ObjFieldLowerCamelCase(String str, Class clazz) {
if (StringUtils.isEmpty(str) || clazz == null) {
return null;
}
try {
ObjectMapper objectMapper = OBJECT_MAPPER_SNAKE_CASE;
return clazz.equals(String.class) ? (T) str : objectMapper.readValue(str, clazz);
} catch (Exception e) {
log.warn(“Parse String to Object error : {}”, e.getMessage());
return null;
}
}

/\*\*

* 字符串转换为自定义对象(List); 属性名从下划线形式改为驼峰
*
* @param str 要转换的字符串
* @param typeReference 自定义对象的typeReference List 对象
* @return 自定义对象
*/
public static List string2ListFieldLowerCamelCase(String str, TypeReference<List> typeReference) {
if (StringUtils.isEmpty(str) || typeReference == null) {
return null;
}
try {
ObjectMapper objectMapper = OBJECT_MAPPER_SNAKE_CASE;
return objectMapper.readValue(str, typeReference);
} catch (Exception e) {
log.warn(“Parse String to Object error : {}”, e.getMessage());
return null;
}
}

/\*\*

* 对象转Json格式字符串(格式化的Json字符串)
*
* @param obj 对象
* @return 美化的Json格式字符串
*/
public static String obj2StringPretty(T obj) {
if (obj == null) {
return null;
}
try {
return obj instanceof String ? (String) obj : OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
} catch (JsonProcessingException e) {
log.warn(“Parse Object to String error : {}”, e.getMessage());
return null;
}
}

/\*\*

* 字符串转换为自定义对象
*
* @param str 要转换的字符串
* @param clazz 自定义对象的class对象
* @return 自定义对象
*/
public static T string2Obj(String str, Class clazz) {
if (StringUtils.isEmpty(str) || clazz == null) {
return null;
}
try {
return clazz.equals(String.class) ? (T) str : OBJECT_MAPPER.readValue(str, clazz);
} catch (Exception e) {
log.warn(“Parse String to Object error : {}”, e.getMessage());
return null;
}
}

/\*\*

* 字符串转换为自定义字段转为list
* @param str
* @param typeReference
* @param
* @return
*/
public static T string2Obj(String str, TypeReference typeReference) {
if (StringUtils.isEmpty(str) || typeReference == null) {
return null;
}
try {
return (T) (typeReference.getType().equals(String.class) ? str : OBJECT_MAPPER.readValue(str, typeReference));
} catch (IOException e) {
log.warn(“Parse String to Object error”, e);
return null;
}
}

public static <T> T string2Obj(String str, Class<?> collectionClazz, Class<?>... elementClazzes) {
    JavaType javaType = OBJECT\_MAPPER.getTypeFactory().constructParametricType(collectionClazz, elementClazzes);
    try {
        return OBJECT\_MAPPER.readValue(str, javaType);
    } catch (IOException e) {
        log.warn("Parse String to Object error : {}" + e.getMessage());
        return null;
    }
}

}


### 4.实体类


**说明:** 这里创建一个user实体类



package com.clllb.jackson.PO;

import lombok.Data;

import java.util.List;

@Data
public class User {

private String username;

private Integer age;

private List<String> info;

private Long userId;

}


项目样图:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b14c88cab52344f0842363161478e1de.png)


### 5.测试类


**说明:** 测试类中直接调工具类中的方法,非常简单,附输出结果。


#### a.object类型转Json


**说明:** 使用writeValueAsString方法



@Test
void obj2string(){
User user = new User();
user.setUsername(“clllb”);
user.setAge(24);
user.setUserId(1L);
List infoList = new ArrayList<>();
infoList.add(“有一百万”);
infoList.add(“发大财”);
user.setInfo(infoList);

    String json = JacksonUtil.obj2String(user);
    System.out.println(json);
}

输出结果:



{“username”:“clllb”,“age”:24,“info”:[“有一百万”,“发大财”],“userId”:1}


#### b.object类型转file


**说明:** 使用writeValue方法



@Test
void obj2file(){
User user = new User();
user.setUsername(“clllb”);
user.setAge(24);
user.setUserId(1L);
List infoList = new ArrayList<>();
infoList.add(“有一百万”);
infoList.add(“发大财”);
user.setInfo(infoList);
String fileName = “ccccc”;
JacksonUtil.obj2File(fileName,user);
}


输出结果:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/4327a6054f1248a3a97a3849114a3a3a.png)


#### c.string类型转Object自定义类型


**说明:** 使用readValue方法



@Test
void string2obj(){
String json = “{“username”:“clllb”,“age”:24,“info”:[“有一百万”,“发大财”],“userId”:11}”;
User user = JacksonUtil.string2Obj(json, User.class);
System.out.println(user);
}


输出结果:



User(username=clllb, age=24, info=[有一百万, 发大财], userId=11)


#### d.string类型转Object自定义类型list


**说明:** 使用readValue方法,传参变为TypeReference typeReference,这里工具类用的重载方法名是相同的。



@Test
void string2objList(){
String json = “[{“username”:“clllb”,“age”:24,“info”:[“有一百万”,“发大财”],“userId”:11},\n” +
“{“username”:“陈老老老板”,“age”:25,“info”:[“有一千万”,“发大大财”],“userId”:12}]”;
List user = JacksonUtil.string2Obj(json, new TypeReference<List>(){});
user.forEach(System.out::println);
}


输出结果:



User(username=clllb, age=24, info=[有一百万, 发大财], userId=11)
User(username=陈老老老板, age=25, info=[有一千万, 发大大财], userId=12)


#### e.object类型转String(驼峰转下划线)


**说明:** 使用writeValueAsString方法,这里区别看工具类就会发现,就是多了一个设置`OBJECT_MAPPER_SNAKE_CASE.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);`



@Test
void obj2sringSnakeCase(){
User user = new User();
user.setUsername(“clllb”);

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

 @Test
    void obj2sringSnakeCase(){
        User user = new User();
        user.setUsername("clllb");


**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
[外链图片转存中...(img-mHCjsAVY-1715796510122)]
[外链图片转存中...(img-Ug3MDD69-1715796510122)]

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 16
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值