当前位置: 首页 > wzjs >正文

网站文字规划网站源码整站下载

网站文字规划,网站源码整站下载,哪个找房网站好,网站建设的机构ObjectMapper 是 Jackson 库的核心类,专门用于处理 JSON 数据的序列化(Java 对象 → JSON)和反序列化(JSON → Java 对象)。在你提供的代码中,它解决了字符串响应特殊处理的关键问题。 一、为什么需要 Obj…

ObjectMapper 是 Jackson 库的核心类,专门用于处理 JSON 数据的序列化(Java 对象 → JSON)和反序列化(JSON → Java 对象)。在你提供的代码中,它解决了字符串响应特殊处理的关键问题。

一、为什么需要 ObjectMapper?

问题背景

if (body instanceof String) {return mapper.writeValueAsString(Result.success(body));
}

这段代码处理的是当控制器返回纯字符串时的特殊情况。在 Spring MVC 中,不同类型的返回值有不同的处理方式:

返回值类型处理方式问题
对象/集合自动使用 JSON 转换器
字符串使用字符串转换器无法自动包装为 JSON

具体问题演示

假设有一个控制器:

@RestController
public class ExampleController {@GetMapping("/string")public String getString() {return "hello"; // 返回纯字符串}
}

没有 ObjectMapper 的情况

  1. beforeBodyWrite 返回 Result.success("hello")
  2. Spring 尝试使用 StringHttpMessageConverter 处理
  3. 因为 Result 不是字符串 → 类型转换错误!

二、ObjectMapper 如何解决这个问题

解决方案

mapper.writeValueAsString(Result.success(body));

分步解析

创建包装对象:Result result = Result.success("hello");
// 得到:{code:200, msg:"success", data:"hello"}
手动序列化为 JSON 字符串:String json = mapper.writeValueAsString(result);
// 得到:'{"code":200,"msg":"success","data":"hello"}'

 

  1.    最终返回字符串结果

    • 符合 StringHttpMessageConverter 的预期
    • 客户端收到标准 JSON 格式

序列化过程图解

Java对象: Result├─ code: 200├─ msg: "success"└─ data: "hello"↓ ObjectMapper 序列化
JSON字符串: '{"code":200,"msg":"success","data":"hello"}'

三、ObjectMapper 的核心能力

1. 序列化配置

// 创建时可配置(代码中通常静态初始化)
private static ObjectMapper mapper = new ObjectMapper();// 常用配置(可添加到静态初始化块)
static {// 美化输出(开发环境)mapper.enable(SerializationFeature.INDENT_OUTPUT);// 空值不参与序列化mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);// 日期格式标准化mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
}

2.支持复杂类型

// 嵌套对象
Result result = Result.success(new User("Alice", 25));
String json = mapper.writeValueAsString(result);
// 输出:{"code":200,"msg":"success","data":{"name":"Alice","age":25}}// 集合类型
List<String> list = Arrays.asList("A", "B", "C");
String json = mapper.writeValueAsString(Result.success(list));
// 输出:{"code":200,"msg":"success","data":["A","B","C"]}

3. 自定义序列化(高级)

// 自定义序列化器
public class MoneySerializer extends StdSerializer<BigDecimal> {public MoneySerializer() {super(BigDecimal.class);}@Overridepublic void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider provider) {gen.writeString(value.setScale(2) + "元");}
}// 注册自定义序列化器
mapper.registerModule(new SimpleModule().addSerializer(BigDecimal.class, new MoneySerializer()));// 使用效果
Result result = Result.success(new BigDecimal("123.456"));
String json = mapper.writeValueAsString(result);
// 输出:{"code":200,"msg":"success","data":"123.46元"}

四、实际应用场景

场景 1:统一处理日期格式

static {mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
}// 控制器返回
@GetMapping("/date")
public Date getDate() {return new Date(); // 返回日期对象
}// 处理结果
// 原始输出:1689987600000(时间戳)
// 处理后输出:"2023-07-22"

场景 2:处理枚举类型

public enum Status {ACTIVE, INACTIVE
}// 默认序列化
Status.ACTIVE → "ACTIVE"(枚举名)// 自定义序列化
mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);// 在枚举中添加toString
public enum Status {ACTIVE("激活"), INACTIVE("禁用");private String desc;@Overridepublic String toString() {return desc;}
}// 输出结果:"激活"

场景 3:处理特殊字符

String text = "包含<特殊>字符&符号";
Result result = Result.success(text);// 未处理时:可能破坏JSON结构
// 处理后:自动转义为"包含\u003C特殊\u003E字符\u0026符号"

完整的最佳实践

@Slf4j
@ControllerAdvice
public class GlobalResponseAdvice implements ResponseBodyAdvice<Object> {// 静态初始化(线程安全)private static final ObjectMapper mapper = new ObjectMapper();static {// 基础配置mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);// 日期格式mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));// 注册Java 8时间模块mapper.registerModule(new JavaTimeModule());}@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {// 排除特定注解或类型return !returnType.hasMethodAnnotation(IgnoreWrap.class);}@SneakyThrows@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {// 1. 已经是包装类型则直接返回if (body instanceof Result) {return body;}// 2. 处理空响应if (body == null) {return Result.success();}// 3. 特殊处理String类型if (body instanceof String) {// 设置正确的Content-Typeresponse.getHeaders().setContentType(MediaType.APPLICATION_JSON);return mapper.writeValueAsString(Result.success(body));}// 4. 添加请求ID到响应头String requestId = request.getHeaders().getFirst("X-Request-ID");if (requestId != null) {response.getHeaders().add("X-Request-ID", requestId);}// 5. 默认包装return Result.success(body);}
}

总结

ObjectMapper 在统一响应处理中扮演着JSON 序列化引擎的角色,核心解决了两个关键问题:

  1. 统一响应格式:将各种类型的数据包装为标准结构
  2. 特殊类型处理:解决字符串返回值无法自动包装的问题

通过合理配置 ObjectMapper,可以实现:

  • 日期、枚举等特殊类型的格式化
  • 空值过滤、缩进美化等输出控制
  • 复杂对象和集合的序列化
  • 自定义序列化逻辑

文章转载自:

http://J4LF7rpx.qwxhr.cn
http://AWlEAPH7.qwxhr.cn
http://T7gNatmh.qwxhr.cn
http://RX3eh7g3.qwxhr.cn
http://cjPPIlMQ.qwxhr.cn
http://nrGA805W.qwxhr.cn
http://AEquvQ4p.qwxhr.cn
http://l8KOKYYm.qwxhr.cn
http://cdkuR1wW.qwxhr.cn
http://illPoXel.qwxhr.cn
http://jzBWUUgt.qwxhr.cn
http://XT8jZxQF.qwxhr.cn
http://6qvQaKLN.qwxhr.cn
http://h5eJa5uw.qwxhr.cn
http://3Dx1QQvM.qwxhr.cn
http://6aqzZv7A.qwxhr.cn
http://3u626LXQ.qwxhr.cn
http://vIY0mI2I.qwxhr.cn
http://wsn9eRSu.qwxhr.cn
http://8jsnaHJv.qwxhr.cn
http://1s3tiBoe.qwxhr.cn
http://NLT9iw1p.qwxhr.cn
http://rwPBY0L6.qwxhr.cn
http://Z86EwtUF.qwxhr.cn
http://JzfqeXZX.qwxhr.cn
http://k9RgMaK8.qwxhr.cn
http://PFnebmnC.qwxhr.cn
http://2iF4qbfs.qwxhr.cn
http://TGD3b1K8.qwxhr.cn
http://DXRGZHRy.qwxhr.cn
http://www.dtcms.com/wzjs/593155.html

相关文章:

  • 公众号文案里怎么做网站链接百度seo是什么意思呢
  • 网站开发培训光山免费网页游戏在线玩
  • 财经投资公司网站建设方案西安网络seo公司
  • 寮步建设网站标书制作收费标准
  • 网站的上一页怎么做的wordpress付费主题国内优秀
  • 免费做网站站标视频不可添加橱窗入口
  • 广州的网站建设公司wordpress返现
  • 企业网站做seo的优势商务网站建设组成包括网站优化
  • 做团餐 承包食堂的企业网站wordpress 自动 图片大小
  • 深圳自助企业建站模版美食网站二级页面模板
  • 自己如何做网站网站规划要点
  • 坪地网站建设信息工业和信息化部装备工业发展中心
  • 芜湖推广公司seo哪里有培训
  • 南京网站设计公司兴田德润放心外贸公司注册需要多少钱
  • 办网站用什么证件大型游戏平台排行榜
  • 那个网站是专门做渔具的wordpress 移除侧边栏
  • 购物车网站设计wordpress 中文杂志主题
  • 企业案例网站自做淘宝客网站
  • 四川网站开发哪家好做市场调查的网站免费
  • html5网站开发教学网站架构推荐
  • 做手机网站用什么软件网上推广渠道有哪些
  • 网站定制联通卡天河网站建设技术
  • 网站建设合同标准版中装建设集团董事长
  • dnf游戏币交易网站建设网站开发的英文
  • 襄阳市住房和城乡建设局网站微信公众号怎么发布文章
  • 网站注册流程北京服务设计
  • 做网站制作的公司机房网络组建方案
  • 菏泽兼职网站建设关键词排名工具
  • 上海网站建设建站游戏推广话术技巧
  • 腾讯快速建站平台wordpress内容管理