zoukankan      html  css  js  c++  java
  • Java 实体类转json对象,属性名转key后首字母强制被转成小写的解决方案

    1.情景展示

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

    2.原因分析

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

      先来看看Java实体类构成:

      开始尝试

      使用netJson

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

      使用aliJson

     

      照样不行。 

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

    3.解决方案

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

      引入谷歌的GSON

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

     

      大功告成。

      说明:

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

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

    4.Bug

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

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

     

      解决方案,见文末推荐。 

    2021-03-16

    5.第二种解决方案

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

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

      如何验证一下呢?

      在idea中,打开maven视图

      实体类

      错误示例:

      我们会发现,首字母也全都被强制转换成了小写,是不是这就说明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。

      深入探究 

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

      常用的还有@JsonFormat和@JsonIgnore

     

      执行结果如下:

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

    6.两种方案对比   

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

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

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

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

      Jackson:会自动填充值为null

      区别二:html编码

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

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

    写在最后

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

     相关推荐:

  • 相关阅读:
    《数据密集型应用系统设计》读书笔记
    每周总结
    每周总结
    每周总结
    《数据密集型应用系统设计》读书笔记
    每周总结
    《重构》读书笔记
    每周总结
    软件过程与管理知识回顾
    操作系统知识汇总5-6章
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/14062368.html
Copyright © 2011-2022 走看看