Springboot 通过FastJson实现bean对象和Json字符串互转问题

 更新时间:2022年08月19日 08:53:45   作者:算死草  
这篇文章主要介绍了Springboot 通过FastJson实现bean对象和Json字符串互转,本文尝试验证两种场景给大家详细介绍,对Springboot FastJson实现bean和Json互转问题,感兴趣的朋友一起看看吧

Json格式在后台服务中的重要性就不多说了,直入正题。
首先引入pom文件,这里使用的是1.2.83版本

 <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
             <version>1.2.83</version>
         </dependency>

接着我们尝试验证两种场景
1、Model对象转Json字符串
2、Json字符串转Model对象
在验证之前我们需要先编写一个model类,这个model类的字段我们可以使用fastJson中的注解@JSONField来修饰,并添加name值。
这个注解的作用,将该model类的字段和对应的json对象的key相对应起来。(防盗连接:本文首发自 )
当然你也可以不添加该注解,这样就相当于使用了字段名称本身与json对象的key建立映射。
为了尽可能的展示各种场景,我在下边的model 示例中,使用了好几种场景
1、注解的name值与字段值相同
2、注解的name值与字段值不同
3、不设置注解
4、作用在复杂引用类型上
5、作用在基本类型上
7、作用在容器上

如图

@Data
public class ProjectModel {
    @JSONField(name = "projectName")
    private String projectName;
    @JSONField(name = "projectId")
    private int id;
    private List<String> userIdList;
    @JSONField(name = "userBeanList")
    private List<User> userList;
    @JSONField(name = "adminUser")
    private User adminUser;

    @Data
    public static class User {
        @JSONField(name = "user-id")
        private String userId;
        private String user_Name;
    }
}

接下来我们开始验证:
场景一、Model对象转Json字符串

@PostConstruct
    public void handleConvertJson() {
        ProjectModel projectModel= createProjectModel();
        String projectJson = JSON.toJSONString(projectModel);
        System.out.println(projectJson);
    }
    private ProjectModel createProjectModel() {
        ProjectModel projectModel = new ProjectModel();
        projectModel.setId(999);
        projectModel.setProjectName("p-1");
        List<String> userIdList = new ArrayList<>();
        userIdList.add("3");
        userIdList.add("2");
        userIdList.add("1");
        projectModel.setUserIdList(userIdList);

        ProjectModel.User adminUser=new ProjectModel.User();
        adminUser.setUser_Name("admin");
        adminUser.setUserId("0");
        projectModel.setAdminUser(adminUser);

        List<ProjectModel.User> userList = new ArrayList<>();
        ProjectModel.User user3 = new ProjectModel.User();
        user3.setUserId("3");
        user3.setUser_Name("name3");
        userList.add(user3);
        ProjectModel.User user2 = new ProjectModel.User();
        user2.setUserId("2");
        user2.setUser_Name("name2");
        userList.add(user2);
        projectModel.setUserList(userList);
        return projectModel;
    }

执行结果格式化后如下

{
"adminUser": {
"user-id": "0",
"user_Name": "admin"
},
"projectId": 999,
"projectName": "p-1",
"userBeanList": [
{
"user-id": "3",
"user_Name": "name3"
},
{
"user-id": "2",
"user_Name": "name2"
}
],
"userIdList": [
"3",
"2",
"1"
]
}

注意看,(防盗连接:本文首发自)如果model类字段设置了JSONField注解的话,则优先级最高,如果未设置该注解的话,则按照model类中字段的名称进行设置。而基本类型、复杂类型、复杂类型容器等场景均支持。
场景二、Model对象转Json字符串
新增代码如下:

@PostConstruct
    public void handleJson2() {
        String newSourceJson="{\"projectId\":999,\"projectName\":\"p-1\"," +
                "\"userBeanList\":[{\"userId\":\"3\",\"user_Name\":\"name3\"},{\"user-id\":\"2\"," +
                "\"user_Name\":\"name2\"}],\"userIdList\":[\"3\",\"2\",\"1\"]}";
        ProjectModel newProject = JSONObject.parseObject(newSourceJson,
                ProjectModel.class);
        String newProjectJson = JSON.toJSONString(newProject);
        System.out.println(newSourceJson);
        System.out.println(newProjectJson);
    }

Json串我们使用场景1的输出,但是稍作修改:删掉adminUser,同时注意userBeanList容器中的元素,两个id的key不一样,一个叫做userId(类字段名),一个叫做user-id(JSONField的name值)。然后再将对象转为Json串,用这两个Json串进行比较:

经过转换后,userId字段消失了,这是由于null值不会被序列化出来的缘故。也从侧面证明了反序列化时,如果@JSONField存在的话,必须要与@JSONField值保持一致,否则字段值不会写入。如图:

另外我们补充一个特殊情况情况,Model对象的字段为null转Json串时,如何保留null值:(防盗连接:本文首发自)
注意第8行的转换增加了参数SerializerFeature.WriteMapNullValue

@PostConstruct
    public void handleJson3() {
        String newSourceJson="{\"projectId\":999,\"projectName\":\"p-1\"," +
                "\"userBeanList\":[{\"userId\":\"3\",\"user_Name\":\"name3\"},{\"user-id\":\"2\"," +
                "\"user_Name\":\"name2\"}],\"userIdList\":[\"3\",\"2\",\"1\"]}";
        ProjectModel newProject = JSONObject.parseObject(newSourceJson,
                ProjectModel.class);
        String newProjectJson=JSON.toJSONString(newProject, SerializerFeature.WriteMapNullValue);
        System.out.println(newSourceJson);
        System.out.println(newProjectJson);
    }

效果如下,生成的json串会保留null字段

到此这篇关于Springboot通过FastJson实现bean对象和Json字符串互转的文章就介绍到这了,更多相关SpringbootFastJson实现bean和Json互转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis Generator 获取不到字段注释的解决

    Mybatis Generator 获取不到字段注释的解决

    这篇文章主要介绍了Mybatis Generator 获取不到字段注释的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • spring boot+vue实现JSAPI微信支付的完整步骤

    spring boot+vue实现JSAPI微信支付的完整步骤

    JSAPI支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付,下面这篇文章主要给大家介绍了关于spring boot+vue实现JSAPI微信支付的相关资料,需要的朋友可以参考下
    2022-05-05
  • JAVA熔断和降级真实关系的图文详解

    JAVA熔断和降级真实关系的图文详解

    这篇文章主要介绍了Java熔断和降级的关系,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • JVM---jstack分析Java线程CPU占用,线程死锁的解决

    JVM---jstack分析Java线程CPU占用,线程死锁的解决

    这篇文章主要介绍了JVM---jstack分析Java线程CPU占用,线程死锁的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java的Cglib动态代理实现方式详解

    Java的Cglib动态代理实现方式详解

    这篇文章主要介绍了Java的Cglib动态代理实现方式详解,CGLIB是强大的、高性能的代码生成库,被广泛应用于AOP框架,它底层使用ASM来操作字节码生成新的类,为对象引入间接级别,以控制对象的访问,需要的朋友可以参考下
    2023-11-11
  • SpringBoot使用DevTools实现后端热部署的过程详解

    SpringBoot使用DevTools实现后端热部署的过程详解

    在Spring Boot项目中,Spring Boot官方提供你了Devtools热部署模块,通过maven的方式导入就能使用,本文主要SpringBoot通过DevTools实现热部署,感兴趣的朋友一起看看吧
    2023-11-11
  • 快速掌握SpringBoot应用的启动入口

    快速掌握SpringBoot应用的启动入口

    本篇并不是深究内置服务器的启动过程,而是追溯Springboot启动之前到底做了什么?它是如何与我们经常写的@SpringBootApplication注解注释的main方法类绑定起来的?对SpringBoot启动入口相关知识感兴趣的朋友一起看看吧
    2022-05-05
  • Java实现贪吃蛇游戏

    Java实现贪吃蛇游戏

    这篇文章主要为大家详细介绍了Java实现贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • 如何解决SpringBoot2.x版本对Velocity模板不支持的方案

    如何解决SpringBoot2.x版本对Velocity模板不支持的方案

    这篇文章主要介绍了如何解决SpringBoot2.x版本对Velocity模板不支持的方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 代码生成器MyBatisX:自动生成代码方式

    代码生成器MyBatisX:自动生成代码方式

    MyBatisX是一款提高开发效率的插件,可以自动生成Mapper、XML和Java实体类代码,并支持数据库表的重置和JAP提示,安装步骤简单,只需在IDEA的Plugin市场搜索并安装MyBatisX,然后打开数据库窗口选择表进行生成即可
    2024-11-11

最新评论