JacksonJson序列化:@JsonComponent、StdSerializer
程序员文章站
2022-06-28 13:04:54
业务代码/*** 业务数据类*/@Data@Builder@AllArgsConstructor@NoArgsConstructorpublic class BusinessData {/*** id*/private String id;/*** 金钱*/private Money money;}/*** 金钱类*/@Data@Builder@AllArgsConstr......
能否请你动动手指,留下你的一键三连。
业务代码
/**
* 业务数据类
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BusinessData {
/**
* id
*/
private String id;
/**
* 金钱
*/
private Money money;
}
/**
* 金钱类
*/
@Data
@AllArgsConstructor
public class Money {
/**
* 金额
*/
private BigDecimal amount;
/**
* 单元
*/
private String unit;
}
/**
* 控制层
*/
@RestController
@RequestMapping("/business")
public class BusinessController {
@RequestMapping("/get")
public BusinessData getBusinessData() {
Money money = new Money(BigDecimal.valueOf(20), "CNY");
return BusinessData.builder().id("test_001").money(money).build();
}
}
调用Controller层接口,没有增加自定义序列化之前的返回结果:
{
"id": "test_001",
"money": {
"amount": 20,
"unit": "CNY"
}
}
增加自定义序列化逻辑
/**
* 自定义序列化逻辑
*/
@JsonComponent
public class MoneySerializer extends StdSerializer<Money> {
protected MoneySerializer() {
super(Money.class);
}
/**
* 序列化逻辑,只取出Money中的amount
*/
@Override
public void serialize(Money money, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeNumber(money.getAmount());
}
}
增加自定义序列化逻辑之后的返回结果:
{
"id": "test_001",
"money": 20
}
划重点
@JsonComponent
用于把该序列化类注册到JsonComponentModule中。
StdSerializer:
所有标准序列化程序所使用的基类,这个是编写自定义序列化程序所推荐使用的基类。
抽象序列化方法:
serialize,由子类实现该方法。
serialize方法使用方式:
调用JsonGenerator的write开头的方法以写入序列化后的数据
本文地址:https://blog.csdn.net/weixin_42600999/article/details/111897584