• 售前

  • 售后

热门帖子
入门百科

FastJson序列化和反序列化标题纪录

[复制链接]
123456790 显示全部楼层 发表于 2022-1-16 06:51:16 |阅读模式 打印 上一主题 下一主题
序列化与反序列化标题

调用外部接口,http://100.111.55.67:9999/cmdb/v0.2.0/departments?page_size=1000,返回数据格式如下:
  1. {
  2.     "code": 0,
  3.     "content": [
  4.         {
  5.             "id": "4561",
  6.             "level": 1,
  7.             "name": "业务后台",
  8.             "parent_id": "1",
  9.             "parent_name": "信仰科技"
  10.         }
  11.     ],
  12.     "msg": "success"
  13. }
复制代码
居然是下划线定名的。如今须要将该接口包一层,然后袒露给前端。前后端的开辟规范是返回驼峰定名的数据。
直接利用JSONObject剖析也行,但是较好的方式是界说一个POJO,并加上注解@JSONField:
  1. @Data
  2. public class CmdbModel {
  3.     private Integer id;
  4.     private Integer level;
  5.     private String name;
  6.     @JSONField(name = "parent_id")
  7.     private Integer parentId;
  8.     @JSONField(name = "parent_name")
  9.     private String parentName;
  10. }
复制代码
  1. @Data
  2. private static class Resp {
  3.     private Integer code;
  4.     private List<CmdbModel> content;
  5.     private String msg;
  6. }
复制代码
Service层代码就是一个简朴的HTTP Get,然后JSONObject反序列化剖析界说的POJO class类。
  1. @Override
  2. public List<CmdbModel> listDepartment() {
  3.     String url = cmdbUrl + DEPARTMENTS;
  4.     try {
  5.         Resp resp = JSONObject.parseObject(HttpUtil.doGet(url), Resp.class);
  6.         if (resp != null && resp.getCode() == 0) {
  7.             return resp.getContent();
  8.         }
  9.     } catch (Exception e) {
  10.         log.error("listDepartment failed: ", e);
  11.     }
  12.     return Collections.emptyList();
  13. }
复制代码
此处返回的数据肯定就是驼峰定名的。
Controller层接口
  1. @RequestMapping("listDepartment")
  2. public String listDepartment() {
  3.     return JSONObject.toJSONString(ServiceUtil.returnSuccessData(cmdbService.listDepartment()));
  4. }
复制代码
标题:Postman调用此接口,发现数据居然和最原始的外部接口的数据一样,是下划线定名。
利用的依靠及其版本号:
  1. <dependency>
  2.      <groupId>com.alibaba</groupId>
  3.      <artifactId>fastjson</artifactId>
  4.      <version>1.2.73</version>
  5. </dependency>
复制代码
缘故因由:ServiceUtil.returnSuccessData返回的是Map范例的数据,JSONObject.toJSONString将Map序列化时,发现有@JSONField注解,然后又把驼峰定名转换为下划线定名。
能不能从@JSONField注解入手办理标题?
看看@JSONField源码:
  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
  3. public @interface JSONField {
  4.     int ordinal() default 0;
  5.     String name() default "";
  6.     String format() default "";
  7.     boolean serialize() default true;
  8.     boolean deserialize() default true;
  9.     SerializerFeature[] serialzeFeatures() default {};
  10.     Feature[] parseFeatures() default {};
  11.     String label() default "";
  12.     boolean jsonDirect() default false;
  13.     Class<?> serializeUsing() default Void.class;
  14.     Class<?> deserializeUsing() default Void.class;
  15.     String[] alternateNames() default {};
  16.     boolean unwrapped() default false;
  17.     String defaultValue() default "";
  18. }
复制代码
渴望结果:反序列化时把下划线反序列化为驼峰定名,随后返回前端的String须要颠末一序次列化过程,序列化时生存驼峰定名。
实验:
注解加上serialize设置得到:@JSONField(name = "parent_id", serialize = false),直接忽视此字段。
看样子,无法以后注解入手办理标题???
别的,不知道别的一个听说比fastjson更强大,版本发布频率强力碾压fastjson的JSON工具jackson,怎么办理这个"标题"?
  1. <dependency>
  2.     <groupId>com.fasterxml.jackson.core</groupId>
  3.     <artifactId>jackson-databind</artifactId>
  4.     <version>2.13.1</version>
  5. </dependency>
复制代码
办理方法:再界说一个VO,CmdbVo的字段和CmdbModel的字段如出一辙,只是没有@JSONField注解,然后利用BeanUtils举行数据赋值:
  1. List<CmdbVo> cmdbVoList = Lists.newArrayListWithCapacity(resp.getContent().size());
  2. resp.getContent().forEach(x -> {
  3.     CmdbVo vo = new CmdbVo();
  4.     BeanUtils.copyProperties(x, vo);
  5.     cmdbVoList.add(vo);
  6. });
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作