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