spring中JSON的自定义序列化
方案1:使用@JsonComponent注解自定义JSON的序列化方式。这种方式,会通过JsonSerializer<String>中<>中的类型,取代spring中String类型默认的json序列化方式。
示例:对象序列化json字符串时,将对象中的指定属性中的值的_变为|
package com.springweb.demo.custrule; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import org.apache.commons.lang3.ObjectUtils; import org.springframework.boot.jackson.JsonComponent; import java.io.IOException; /** * JSON的自定义序列化 * 可以定义多种方式处理json的序列化 */ @JsonComponent public class MyJsonFormatter { /** * 特殊字符的转义 */ public static class SpecialDeCodeProceed extends JsonSerializer<String> { @Override public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { String str = ObjectUtils.isEmpty(value) ? null : value.replace("_", "|"); gen.writeString(str); } } }
方案2.使用@JsonSerialize(using = MyJsonFormatter.SpecialDeCodeProceed.class)指定json的序列化方式,这种方式只是修改这一个地方的json序列化方式。
package com.springweb.demo.respose; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.springweb.demo.custrule.MyJsonFormatter; import lombok.Data; @Data public class TestResp { @JsonSerialize(using = MyJsonFormatter.SpecialDeCodeProceed.class) private String respText; }
测试结果
接口:
@PostMapping("/post") @ResponseBody @Operation(summary = "输出post", description = "post接口", method = "POST") @ApiOperationSupport(order = 1) @AccessLimit public TestResp postString(@RequestBody TestReq request){ TestResp resp = new TestResp(); String s = "hello, post method.[" + request.getReqText() + "]"; resp.setRespText(s); return resp; }
结果: