1.情景展示

Java 实体类转json对象,属性名转key后首字母强制被转成小写的解决方案_JAVAUTILS

  如上图所示,实体类转json,在Java开发中还是很常见的,问题在于:Java属性名称首字母是大写,要求转成json后首字母也必须是大写,如何实现?   

2.原因分析

  我们知道在Java规范中,实体类的属性名的命名规范需要遵循首字母小写的驼峰命名法,既是规范也是约束也是牢笼。这个时候一旦有人不按规范走,就会发生有趣的事情(一会再说)。

  先来看看Java实体类构成:

Java 实体类转json对象,属性名转key后首字母强制被转成小写的解决方案_首字母_02

  开始尝试

  使用netJson

Java 实体类转json对象,属性名转key后首字母强制被转成小写的解决方案_JAVAUTILS_03

  如上图所示,首字母被强转小写,既然不行,就换一个json; 

  使用aliJson

Java 实体类转json对象,属性名转key后首字母强制被转成小写的解决方案_json_04

 

  照样不行。 

  此时,被关在笼子里的人就会炸开了锅:WAHT FUCK,两个json都不支持,你为什么不按规范走?此时,就会被冲昏头脑,去指责对方而不是承认自己的无能。

3.解决方案

  规范是死的,人是活的,所以,我才说规范有时会像牢笼,束缚着我们前进的脚步,不敢越雷池一步。解决办法还是有的。

  引入谷歌的GSON

<!--序列化:实体类转json需要用到(原Java类中的属性转成json后大小写保持不变)-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>

Java 实体类转json对象,属性名转key后首字母强制被转成小写的解决方案_实体类_05

 

  大功告成。

  说明:

  这里需要注意的是,使用谷歌的Gson将实体类转json,key的名称会完完全全照搬类的属性名称,但是,它只能完成实体类到json字符串的转换,如果需要转成json对象,再调用ali/net均可。

  如果不喜欢这种实现方式,还可以迭代json取值,将key的首字母转大写,也是可以哒。

4.Bug

  使用gson将实体类转成json字符串的这种方式,会有一个弊端:

  如果实体类的属性值,出现大于号、小于号、等号等符号时,调用GsonBuilder进行转换时,这些符号会被强制转换成unicode编码,如下图所示:

Java 实体类转json对象,属性名转key后首字母强制被转成小写的解决方案_JAVAUTILS_06

 

  解决方案,见文末推荐。 

2021-03-16

5.第二种解决方案

  使用Jackson也可以实现同样的效果

  如果你的项目框架使用的是springboot的话,就无需引用jackjson的jar包了,springboot就是使用的jackjson完成json的序列化和反序列化的;

  如何验证一下呢?

  在idea中,打开maven视图

Java 实体类转json对象,属性名转key后首字母强制被转成小写的解决方案_json_07

  实体类

Java 实体类转json对象,属性名转key后首字母强制被转成小写的解决方案_json_08

  错误示例:

Java 实体类转json对象,属性名转key后首字母强制被转成小写的解决方案_首字母_09

  我们会发现,首字母也全都被强制转换成了小写,是不是这就说明Jackson也不行?

  分析:

  正常情况下,在springboot中,为了解决前后端字段不一致的问题,我们通常在实体类接收前端请求参数或者响应给前端参数时,通常使用@JsonProperty注解完成字段的映射问题。

  那么,我们是不是也可以这样使用呢,一起来试一下

  正确示例:

try {
Result result = new Result();
result.setCode("200").setFormat("PDF").setMessage("成功");
String jsonStr = new ObjectMapper().writeValueAsString(result);
System.out.println(jsonStr);
} catch (JsonProcessingException e) {
e.printStackTrace();
}

  这样,Jackson在序列化时,就会取@JsonProperty注解所声明的字段作为json的key。

Java 实体类转json对象,属性名转key后首字母强制被转成小写的解决方案_JAVAUTILS_10

Java 实体类转json对象,属性名转key后首字母强制被转成小写的解决方案_JAVAUTILS_11

  深入探究 

  Jackson的其它注解是不是也是可以使用呢?

  常用的还有@JsonFormat和@JsonIgnore

Java 实体类转json对象,属性名转key后首字母强制被转成小写的解决方案_首字母_12

 

  执行结果如下:

Java 实体类转json对象,属性名转key后首字母强制被转成小写的解决方案_json_13

  两个注解都没有生效,但如果将这个实体类直接返回给前端的话,springboot会作出注解对应的处理。

6.两种方案对比   

  区别一:实体类属性没有赋值

  如果没有赋值的属性的数据类型是基础数据类型(八种基本数据类型:byte,short,int,long,double,float,boolean,char),两者都会自动为其属性值设置默认值

  如果没有赋值的属性的数据类型是封装类(非基本数据类型)

  Gson:该属性就不会作为key出现

  Jackson:会自动填充值为null

  区别二:html编码

  Gson:如果实体类的属性值,出现大于号、小于号、等号等符号时,调用GsonBuilder进行转换时,这些符号会被强制转换成unicode编码(当然,有解决访问,见文末推荐)

  Jackson:不会对其进行编码,保持原样 

Java 实体类转json对象,属性名转key后首字母强制被转成小写的解决方案_JAVAUTILS_14

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 

 

作者:​​Marydon​​