首页 > 其他分享 >Json序列化对象后,使用Lombok后属性xAxis大写变成小写xaxis解决方法

Json序列化对象后,使用Lombok后属性xAxis大写变成小写xaxis解决方法

时间:2023-05-12 17:11:48浏览次数:43  
标签:Map 小写 yAxis Spring Json xaxis Lombok 序列化 public

一、问题描述

最近在开发后端接口时,发现返回结构中,一个字段大小写转化有问题。

lombok版本:1.18.14

VO对象如下,字段为echarts趋势图组件。预期返回xAxis,实际返回xaxis

@Data
public class ULineBarVO {
     /**
     * X轴信息
     */
    private ULineBarDataVO xAxis;

    /**
     * Y轴信息
     */
    private Map<String,Object> yAxis;
}

Spring boot项目中使用Lombok注解@Data之后,返回给前端的是xaxis,而不是我们预期中的xAxis。

 

二、问题原因

针对首字母小写,第二个字母大写的这种驼峰命名时。

使用@Data注解生成的getter和setter方法分别是:

public Map<String, Object> getYAxis() {
    return yAxis;
}
public void setYAxis(Map<String, Object> yAxis) {
    this.yAxis = yAxis;
}

 而正常场景下及Spring中对象的getter和setter方法应该是,注意方法名上getyAxis首字母是小写:

public Map<String, Object> getyAxis() {
    return yAxis;
}
public void setyAxis(Map<String, Object> yAxis) {
    this.yAxis = yAxis;
}

也就是说Lombok与Spring针对这种首字母小写,第二个字母大写的对象的解析是不同的,而这也就自然而然影响到默认的Jackson的解析,导致返回给前端的属性名称不是我们预期中的名称。 

三、Lombok问题

其实,针对这个问题,多年前就有人已经在lombok的github提出过对应的issue,参考:

https://github.com/projectlombok/lombok/issues/757

无论是Lombok还是Spring,在处理对象的时候总会有一个API规范进行参考的,这个规范一般就是JavaBeans API的规范。而针对这个问题,Lombok的官方回复是:

JavaBeans的规范就是这样的,Lombok只是遵循这个规范而已,并且不应该使用首字母小写,第二个字母大写这样的命名规则,而Spring的处理方式才是没有遵循JavaBean的规范。除非Oracle官方推荐如此或者大家都是这样处理的化,Lombok才会进行修改。

也就是说,Lombok认为,JavaBeans的规范就是这么定义的,而针对JavaBean的规范,Spring和Lombok选择了不同的实现方式:

Spring,Jackson针对get/set的生成方式,和我们使用 IDEA 编译器自动生成get/set的方式是相同的,都是诸如getiPhone()的形式。

Lombok,针对get/set的生成方式,是getIPhone()的形式。

其实根据JavaBeans的描述,是没有具体说明针对我们文中这个问题,首字母小写,第二个字母大写这样的字段该如何get/set的

https://stackoverflow.com/questions/2948083/naming-convention-for-getters-setters-in-java/49348966#49348966
https://github.com/projectlombok/lombok/issues/504

 四、解决方法,因为预期返回xAxis,而不是返回xaxis。需要手写get set方法,不使用lombok。解析正常

public Map<String, Object> getyAxis() {
    return yAxis;
}
public void setyAxis(Map<String, Object> yAxis) {
    this.yAxis = yAxis;
}

 

本人开发了一款在线的程序员工具箱,包含json、mysql格式化,ChatGPT等程序员常用的功能。欢迎您访问

地址:https://www.robots2.com/

 

 

 

 

参考文章:https://www.jianshu.com/p/bef7b73e5062 

标签:Map,小写,yAxis,Spring,Json,xaxis,Lombok,序列化,public
From: https://www.cnblogs.com/robots2/p/17395560.html

相关文章

  • fastjson中$ref的坑
    相信不少人都遇到过,用fastjson进行序列化时会遇到属性出现$ref的情况,本质是fastjson在处理对象引用时默认不展开,需要自己指定序列化参数。写个DEMO演示一下:1JSONObjectjson=newJSONObject();2JSONObjectprop=newJSONObject();3prop.put("name","test");4pro......
  • JsonObject相关操作
    一:String转JsonObject:JSONObjectjSONObject=JSONObject.parseObject(string);二:获取JsonObject中的value值:System.out.println("111111111"+jSONObject.getJSONObject("Result").getJSONObject("Result").get("FLinkMan"));三:Js......
  • bat中传递JSON参数时,由于JSON包含一些特殊字符如引号、反斜杠等,需要对JSON字符串进行
    在bat中传递JSON参数时,由于JSON包含一些特殊字符如引号、反斜杠等,这些字符可能会导致命令行解释器解析出错。为了避免这些问题,通常建议对JSON字符串进行一些转义处理。具体转义规则如下:对每个双引号(")进行转义,变成"。对每个反斜杠(\)进行转义,变成\。当你传递一个JSON字符串......
  • 如何将bash变量传递给JSON
    我正在尝试编写示例脚本,在其中生成诸如"student-101...student-160"之类的名称。我需要发布JSON数据,当我这样做时,出现JSON解析错误。这是我的脚本:123456789name="student-10"for i in {1..1}do   r_name=$name$i   echo $r_name  curl -i -H 'Au......
  • json在前端的使用
    调用接口后一般传递的都是json格式的数据,这个json格式的数据吗可能会有多层嵌套,如何获取这个最内层的嵌套value值便是关键。而数据解析放在前端便更加的简单,可以像数组一样使用但是需要解决以下问题:1.数据在后端的时候已经是json格式的object,如何异步发送这个json数据到前端(最新......
  • inputstream转json
    inputstream是一个Java中的输入流,它允许从源读取数据。如果要将inputstream转换为JSON,需要使用相应的解析器,例如GSON或Jackson。以下是使用GSON的示例代码:InputStreaminputStream=...;Gsongson=newGson();JsonReaderreader=newJsonReader(newInputStreamReader(in......
  • 序列化器的序列化与反序列化
    目录一、序列化器介绍和快速使用(重点)1.1序列化类基本使用,序列化多条(使用方式类似forms组件)1.2序列化单条二、反序列化(重点)2.1反序列化的新增2.2反序列化的修改2.3删除单条三、完整的代码四、反序列化的校验五、序列化类常用字段和字段参数(了解)5.1常用字段类5.2常用字段......
  • cJson学习(二)
    已剪辑自:https://blog.csdn.net/ZRXSLYG/article/details/122541036?spm=1001.2101.3001.6650.17&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-17-122541036-blog-123806149.235^v35^pc_relevant_default_base&depth_1-utm_......
  • 基于kibana点点点点获取到 要懂得聚合查询json
    1.点击Visualize2.创建Table的visualization3.选择查询的索引4.勾选查询条件appName为delta-mainsysName为jdl-deltaappDeployPlatform为JDOS3_CN5.选择先按照resourceType进行第一层groupBy条件按照resourceType进行groupBy条件会出来如图所示,按照resourceType进......
  • Android 开发 利用 jq 在 Makefile 里给 output-metadata.json 增加字段
    Makefile:.PHONY:uploadupload:metadata #./push-apk.sh.PHONY:metadatametadata:app/build/outputs/apk/release/output-metadata.jsonapp/build/outputs/apk/release/output-metadata.json:buildupdate-content.txt #在Makefile中插入shell脚本要用双美元......