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

摘要:
  2.原因分析我们知道在Java规范中,实体类的属性名的命名规范需要遵循首字母小写的驼峰命名法,既是规范也是约束也是牢笼。如果不喜欢这种实现方式,还可以迭代json取值,将key的首字母转大写,也是可以哒。

1.情景展示

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

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

2.原因分析

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

先来看看Java实体类构成:

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

开始尝试

使用netJson

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

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

使用aliJson

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

照样不行。

此时,被关在笼子里的人就会炸开了锅: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后首字母强制被转成小写的解决方案第5张

大功告成。

说明:

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

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

4.Bug

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

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

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

解决方案,见文末推荐。

2021-03-16

5.第二种解决方案

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

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

如何验证一下呢?

在idea中,打开maven视图

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

实体类

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

错误示例:

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

我们会发现,首字母也全都被强制转换成了小写,是不是这就说明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后首字母强制被转成小写的解决方案第10张

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

深入探究

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

常用的还有@JsonFormat和@JsonIgnore

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

执行结果如下:

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

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

6.两种方案对比  

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

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

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

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

Jackson:会自动填充值为null

区别二:html编码

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

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

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

写在最后

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

相关推荐:

免责声明:文章转载自《Java 实体类转json对象,属性名转key后首字母强制被转成小写的解决方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ES6学习之对象的遍历制作多合一安装U盘(Windows + Linux + macOS)精解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信开发-ACCESS TOKEN 过期失效解决方案

微信开发-ACCESS TOKEN 过期失效解决方案 起因:因为access_token的重要性,开发过微信的都知道,但是他有自己的生命周期,官方解释为:"有效期为7200秒",一天调用2000次。流量一高,就over了,没办法,龙哥不帮我们解决问题,我们就要自己解决,不能等死。 解决思路很简单:建立公共access token数据,有效期内不重新创建ac...

MyBatis 映射文件详解(六)

MyBatis 配置文件类型 MyBatis配置文件有两种类型,如下: 全局配置文件(如 mybatis-config.xml) Mapper XML 映射文件(如 UserMapper.xml) 上篇讲解全局配置文件,这篇接着讲解Mapper 接口映射文件 Mapper XML 映射文件详解 CRUD 标签(或元素) select Map...

C#三层ATM-2.编写Model项目实体类

1.对着Model项目名点右键,选择,添加类。 2.新建类-userinfo 3.编写userinfo类的代码 根据数据库字段设计类,每个数据库字段对应一个类的字段。然后,为每一个字段编写一个公有属性。注意类要设置为public的。 using System; namespace Model { /// <summary> /// user...

Gson转换json数据为对象

可以通过Gson使用两种方法,将json字符串转换为对象,以下面该段报文做测试 { "id": 84041462, "lastName": "小华", "age":32, "balance":666255.32, "hobbyDesc": { "subject": "数学",...

聊聊音频类开源代码这点事

我工作的头几年是在通信设备商做通信设备上的语音软件开发,主要是follow ITU-T/3GPP/RFC等SPEC写代码,相对封闭,没怎么接触开源代码。后来到芯片公司做终端上的voice engine,开始接触音频类的开源代码,先是ITU-T/3GPP的各种codec,后来是各种完整的解决方案。刚开始做voice engine的时候,GIPS还没被Goog...

JSON 之GSON 解析

一、 谷歌GSON这个Java类库可以把Java对象转换成JSON,也可以把JSON字符串转换成一个相等的Java对象。Gson支持任意复杂Java对象包括没有源代码的对象。 二、Gson解析Json步骤  A、服务器端将数据转换成json字符串    首先、服务器端项目要导入Gson的jar包到BuiltPath中。( Gson的jar:http://...