spring boot 最佳实践(一)--使用jackson

目前java json解析工具有阿里的fastjson,google的GSON,以及SpringMVC 默认的解析工具Jackson。

Maven引入jar包

spring-boot-starter-web默认引入了以下依赖:

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.8.0</version>
</dependency>
<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.8.7</version>
</dependency>
<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.7</version>
</dependency>

Jackson从2.0开始改用新的包名fasterxml;1.x版本的包名是codehaus。

基础用法

1. 初始化

在spring boot项目里建议全局初始化ObjectMapper

@Configuration
public class AppConfig{
  @Bean
  public ObjectMapper ObjectMapper(){
   ObjectMapper objectMapper=new ObjectMapper();
   return objectMapper;
  }
}

2. 基本用法

//将json字符串转换成对象
Map map = objectMapper.readValue(jsonString, Map.class);
//转换对象类型
SomethingPOJO pojo = objectMapper.convertValue(map, SomethingPOJO.class);
//将对象转换成json字符串
Sting string = objectMapper.writeValueAsString(pojo);
//将json字符串转换成List
JavaType javaType = mapper.getTypeFactory()
.constructParametricType(List.class, Person.class);
List<Person> jsonToPersonList = objectMapper.readValue(arrayToJson, mapType);

3. 枚举

public enum TypeEnumWithValue {
	TYPE1(1, “Type A”), TYPE2(2, “Type 2);
	private Integer id;
	private String name;
	
	/** 
	* @JsonValue只能标识在类的唯一个方法上,表示序列化时使用当前方法转换本对象。
	*/
	@JsonValue
	public String getName() {
		return name;
	}

   /**
   * @JsonCreator标识在一个静态方法上,表示反序列化时使用当前方法初始化本对象。
   */
    @JsonCreator
    public static TypeEnumWithValue  create(String val) {
        TypeEnumWithValue [] units = TypeEnumWithValue.values();
        for (TypeEnumWithValue  unit : units) {
            if (unit.getName().equals(val)) {
                return unit;
            }
        }
        throw new IllegalArgumentException();
       }
    }

4. 配置ObjectMapper

ObjectMapper objectMapper=new ObjectMapper();
// 忽略json字符串中不识别的属性
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 忽略无法转换的对象 “No serializer found for class com.xxx.xxx”
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);

在JDK8项目中使用jackson

在JDK8项目中使用JDK8新特性的话,jackson需要新增依赖包。

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-parameter-names</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.8.6</version>
</dependency>

1. 注册Module


@Configuration
public class AppConfig{
  @Bean
  public ObjectMapper ObjectMapper(){
   ObjectMapper mapper = new ObjectMapper()
   .registerModule(new ParameterNamesModule())
   .registerModule(new Jdk8Module())
   .registerModule(new JavaTimeModule());
   return objectMapper;
  }
}

也可以使用自动注册的方式:

ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules();

2. jdk8 time

jdk8使用了新的时间包,在时间对象上需要做的配置。

import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat
public class POJO{
	@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
	private LocalDateTime time;
	
	//getter,setter...
}

快捷配置

在springboo1.1以上的版本默认配置了Jackson的ObjectMapper,不必自行定义bean。
可以这么做全局设置:

spring:
  jackson:
    serialization:
      WRITE_DATES_AS_TIMESTAMPS: false
    default-property-inclusion: non_null

更多配置参见 org.springframework.boot.autoconfigure.jackson.JacksonProperties

参考文档

  1. jackson JDK8: https://github.com/FasterXML/jackson-modules-java8
  2. Jackson JSON Tutorial: http://www.baeldung.com/jackson
  3. Springboot统一配置Jackson:https://www.cnblogs.com/woshimrf/p/springboot-jackson-global-config.html
  4. Spring Boot中Jackson应用详解: https://blog.51cto.com/7308310/2310930
  • 21
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
com.fasterxml.jackson.databind是Java中的一个库,用于处理JSON数据的序列化和反序列化。它是Jackson库的一部分,提供了一组用于操作和处理JSON数据的类和方法。 以下是com.fasterxml.jackson.databind的一些常见用法和示例: 1. 将Java对象序列化为JSON字符串: ```java import com.fasterxml.jackson.databind.ObjectMapper; // 创建ObjectMapper对象 ObjectMapper objectMapper = new ObjectMapper(); // 将Java对象转换为JSON字符串 String json = objectMapper.writeValueAsString(object); ``` 2. 将JSON字符串反序列化为Java对象: ```java import com.fasterxml.jackson.databind.ObjectMapper; // 创建ObjectMapper对象 ObjectMapper objectMapper = new ObjectMapper(); // 将JSON字符串转换为Java对象 Object object = objectMapper.readValue(json, Object.class); ``` 3. 自定义JSON序列化和反序列化规则: ```java import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; // 创建ObjectMapper对象 ObjectMapper objectMapper = new ObjectMapper(); // 创建自定义序列化器 StdSerializer<MyClass> serializer = new StdSerializer<MyClass>(MyClass.class) { @Override public void serialize(MyClass value, JsonGenerator gen, SerializerProvider provider) throws IOException { // 自定义序列化逻辑 } }; // 创建自定义反序列化器 StdDeserializer<MyClass> deserializer = new StdDeserializer<MyClass>(MyClass.class) { @Override public MyClass deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { // 自定义反序列化逻辑 } }; // 创建SimpleModule对象,并注册自定义序列化器和反序列化器 SimpleModule module = new SimpleModule(); module.addSerializer(MyClass.class, serializer); module.addDeserializer(MyClass.class, deserializer); // 将SimpleModule对象注册到ObjectMapper中 objectMapper.registerModule(module); ``` 以上是com.fasterxml.jackson.databind库的一些基本用法和示例。你可以根据具体的需求和场景来使用这个库进行JSON数据的处理和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值