Springboot中解析JSON字符串(jackson库ObjectMapper解析JSON字符串)_fastjson objectmapper.readvalue 跟json.para区别-程序员宅基地

技术标签: spring boot  springboot技术  java常用插件使用  jackson  解析json字符串  

1、ObjectMapper与JSONObject比较

1、ObjectMapper属于jackson库的一部分,JSONObject属于alibaba的fastjson,两者各有优劣,可根据自己的系统环境选择使用哪种技术。

2、目前来看,Jackson社区相对活跃,Spring MVC和Spring Boot都默认使用Jackson。

核心主要有三个部分:

jackson-core(核心包)、jackson-databind(数据绑定包)、jackson-annotations(注解包)

3、依赖包不同

//JSONObject依赖包

<dependency>

    <groupId>com.alibaba.fastjson2</groupId>

    <artifactId>fastjson2</artifactId>

    <version>2.0.42</version>

</dependency>

//ObjectMapper依赖包

<dependency>

    <groupId>com.fasterxml.jackson.core</groupId>

    <artifactId>jackson-databind</artifactId>

    <version>2.14.2</version>

</dependency>

2、ObjectMapper使用概述

ObjectMapper通过writeValue()实现序列化,通过readValue()实现反序列化。

ObjectMapper通过Feature枚举类,初始化了很多的默认配置。

2.1、工程的pom.xml导包信息

spring-boot-starter-web包中包含了jackson包,不需要单独导入

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.17</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.txc</groupId>
    <artifactId>objectmapper</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>objectmapper</name>
    <description>objectmapper</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2.2、创建案例中的测试对象

案例中使用lombok注解生成get和set方法,也可以直接写get和set方法
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {
    private String stu_id;
    private String stu_name;
}

2.3、对象和JSON相互转化

2.3.1、测试代码

/**
 * 实现对象和JSON之间互转
 */
@RequestMapping("/jsonObjectChange")
@ResponseBody
public  void  jsonObjectChange() throws Exception{
    ObjectMapper mapper = new ObjectMapper();
    String param = "{\"stu_id\":\"1001\",\"stu_name\":\"晓春\",\"stu_sex\":\"男\",\"stu_age\":\"34\",\"stu_addr\":\"安徽合肥\",\"stu_pwd\":\"123456\"}";
    //将字符串转换为对象—反序列化过程
    Student student = mapper.readValue(param, Student.class);
    System.out.println("===json转对象==="+student.toString());
    //将对象转化成JSON—序列化过程
    String  json = mapper.writeValueAsString(student);
    System.out.println("===对象转json==="+json);
}

2.3.2、测试结果展示

869bf45b52e24c25a3b23eaa12bec90c.png

2.4、集合和JSON像话转化

2.4.1、测试代码

/**
 * 集合和JSON相互转化
 */
@RequestMapping("/listAndJSONChange")
@ResponseBody
public void  arrayToObject() throws Exception{
    Student student1=new Student("1001","晓春1","男","34","安徽合肥","123456");
    Student student2=new Student("1002","晓春2","男","34","安徽合肥","123456");
    ObjectMapper mapper = new ObjectMapper();
    //集合转json
    String param = mapper.writeValueAsString(Arrays.asList(student1,student2));
    System.out.println("==集合转json=="+param);
    //数组json转化成集合
    List<Student> list= mapper.readValue(param, List.class);
    System.out.println("==数组json转集合=="+list);
}

2.4.2、测试结果展示

6222a958cbf945be9edb19a29b59fd7a.png

2.5、Map和JSON相互转化

2.5.1、测试代码

/**
 * map和json相互转化
 */
@RequestMapping("/mapAndJsonChange")
@ResponseBody
public void  mapAndJsonChange() throws Exception{
    ObjectMapper mapper = new ObjectMapper();
    Map<String, Object> map = new HashMap<>();
    map.put("id", "1001");
    map.put("name","晓春");
    map.put("student", new Student("6","6","6","6","6","6"));
    String param = mapper.writeValueAsString(map);
    System.out.println("===map转json==="+param);
    Map<String, Object> resultMap = mapper.readValue(param, Map.class);
    System.out.println("===json转map==="+resultMap);
}

 2.5.2、测试结果展示

2432ae788b5545e2ae495f3c01b843ef.png

3、如果不需要JSON与其他转化,而是直接获取

使用readTree,通过节点树的方式直接获取JSON属性对应的值

使用链接:https://blog.csdn.net/tangshiyilang/article/details/134326627

4、在Springboot工程中,通过配置的方式,配置ObjectMapper配置

方便使用,一次性配置,会在springboot工程启动的时候自动获取配置

@Configuration
public class ObjectMapperConfig {

    @Bean("objectMapper")
    public ObjectMapper getObjectMapper(){
        ObjectMapper  mapper = new ObjectMapper();
        //属性为NULL 不序列化
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        //属性为默认值不序列化
        mapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT);

        //反序列化时,遇到未知属性不报错
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        //如果是空对象的时候,不抛异常
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

        //修改序列化后日期格式
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

        return mapper;
    }


}

 

 

 

5、常见的ObjectMapper配置及问题总结

5.1、如果生成的JSON使用的是单引号,解析会失败

问题的json样式:String param="{'stu_id':'1001','stu_name':'晓春'}";

默认支持的是双引号,在很多的环境中都是。

解决博客地址:https://blog.csdn.net/tangshiyilang/article/details/134275584

 

5.2、生成的JSON字符串属性没有双引号或者单引号问题

问题json样式:String param="{stu_id:\"1001\",stu_name:\"晓春\"}";

解决博客地址:https://blog.csdn.net/tangshiyilang/article/details/134281368

 

5.3、JSON字符串转化对象,JSON中的属性名称与对象属性名称不同问题

问题描述:JSON字符串中出现了属性名称与对象中的名称不一致的情况,而造成的解析错误。

解决博客地址:https://blog.csdn.net/tangshiyilang/article/details/134281585

 

5.4、对象转化成JSON字符串,如果属性值为null,不被序列化

解决博客地址:解析JSON字符串:属性值为null的时候不被序列化-程序员宅基地

 

6、源码下载

源码需要积分

https://download.csdn.net/download/tangshiyilang/88512083

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tangshiyilang/article/details/134275828

智能推荐

UBGG-3m基于深度学习网络的中国36个大城市精细化景观数据集水体建设用地城市森林草地-程序员宅基地

文章浏览阅读755次,点赞19次,收藏14次。此外,在对比实验中,我们的方法超越了最先进的深度学习网络,凸显了我们提出的方法的有效性。与现有产品的比较分析,包括 2020 年 30 mGlobeLand30(Junetal.,2014 年)、2020 年 10 m Esri土地覆被图(Karra et al.,2021 年)、2020年10 m ESA 世界覆被图(Zanagaetal.,2021 年)、1 m 国家尺度土地覆被图(SinoLC- 1m)(Lietal、 2023)、2m城市树木覆盖数据集(UTC-2m)(Heetal)。

spring 项目中 使用mybatis 与 spring 整合 执行数据库报错 Caused by: java.lang.AbstractMethodError_caused by: java.lang.abstractmethoderror: org.myba-程序员宅基地

文章浏览阅读478次。依赖版本Caused by: java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer; at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(S..._caused by: java.lang.abstractmethoderror: org.mybatis.spring.transaction.spr

基于对比度受限自适应直方图均衡算法的图像增强MATLAB仿真_限制对比度直方图均衡matlab-程序员宅基地

文章浏览阅读298次。图像增强是一种广泛应用于图像处理领域的技术,其主要目的是通过调整图像的亮度、对比度、清晰度等参数,使得图像在视觉上更加清晰、明亮、易于观察和分析。在实际应用中,图像增强可以用于改善图像质量、提高图像的视觉效果、增强图像的细节等等,因此在医学影像、航空航天、安全监控等领域有着广泛的应用。基于对比度受限自适应直方图均衡算法(CLAHE)是一种图像增强算法,它可以动态地调整图像的对比度,以提高图像的视觉效果和清晰度。本文将详细介绍基于CLAHE的图像增强算法,包括算法原理、实现方法、优缺点以及应用举例等方面。_限制对比度直方图均衡matlab

PMP项目管理项目风险管理_项目风险临近-程序员宅基地

文章浏览阅读1k次。目录1 项目风险管理概述2 规划风险管理3 识别风险4 实施定性风险分析5 实施定量风险分析6 规划风险应对7 实施风险应对8 监督风险1 项目风险管理概述项目风险管理的目标在于提高正面风险的概率和(或)影响,降低负面风险的概率和(或)影响,从而提高项目成功的可能性。_项目风险临近

java语句 判断数组中的最大值_辨别数组5.32.28.45.60的最大值,java-程序员宅基地

这篇文章介绍了如何使用Java语句来判断数组中的最大值。通过遍历数组,逐个比较元素大小并更新最大值,最后输出结果。

【加速器源码】PC/Android/IOS/Macos全套四端客户端源码,定制开发网络加速器源码_网络加速源代码-程序员宅基地

文章浏览阅读1.4k次,点赞10次,收藏9次。此外,网络加速器还可以对请求进行优化,例如重排请求的顺序,减少请求的数量,减少响应中的重复数据等,以提高传输速度。例如,网络加速器可以使用TCP加速协议来减少TCP协议的握手延迟和拥塞控制,或者使用智能路由选择算法来选择最佳的网络路径。缓存技术:网络加速器可以使用缓存技术,将常用的数据缓存在本地或者网络加速器的服务器上。总的来说,网络加速器的技术原理主要是通过使用压缩、缓存、请求合并和优化、延迟优化、优化协议和路由选择等技术,来减少数据传输的带宽需求、传输延迟和网络拥塞,从而提高网络传输的速度和性能。_网络加速源代码

随便推点

终于把所有的Python库,都整理出来啦!-程序员宅基地

文章浏览阅读453次。点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达编者荐语为什么我喜欢Python?对于初学者来说,这是一种简单易学的编程语言,另一个原因:大量开箱即用的第三方库,正是23万个由用户提供的软件包使得Python真正强大和流行。如果你是在手机查看,可以点击右上角的“···”,再选择搜索页面内容即可;电脑端建议用网页打开,Ctrl+F即可。库名称简介Chardet字符编码探测器,..._python都有什么库

c语言读取midi文件举例子,从MIDI文件获取音符数据-程序员宅基地

文章浏览阅读971次。Nik Reisman - 对不起,但我不同意你......在C#中解析midi,C++是大约400行代码的东西......它没有什么困难,也没有困难。在简短的描述解析器将如何工作:1)打开midi字节模式2)阅读标题块,其中有关于大小,轨道数量和重要文件格式的信息!- 有3种格式:0,1,2(类型2实际上是“有价值的”,只有少数这种类型的midi文件,所以如果存在类型2,则不需要读取midi)-..._midi节点如何读写

Reeds-Shepp和Dubins曲线_reeds shepp 是最短路径么-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏21次。 【转载】什么是Reeds-Shepp曲线? 想象你下班开车回家,到了小区后想把车停到你个人的停车位里面。作为一个喜欢追求挑战的老司机,你想找一条最短的路径把车停进去。那么这样的路径是什么呢?答案..._reeds shepp 是最短路径么

概要设计检查单、需求规格说明检查单_需求规格说明书检查表-程序员宅基地

文章浏览阅读1k次,点赞18次,收藏15次。需求说明书是否已包括了主要的质量属性,例如有效性、高效性、灵活性、完整性、互操作性、可靠性、健壮性、可用性、可维护性、可移植性、可重用性和可测试性等。操作界面的设计是否有为用户考虑(例如:词汇、使用信息和进入的简易)是否能够对该套系统进行测试、演示、分析或检查来说明它是满足需求的。是否已详细说明了软件环境(共存的软件)和硬件环境(特定的配置)该设计是否反映了实际操作环境(硬件、软件、支持软件)从功能、成果、进度、预算和技术角度上看该设计是否可行。是否所有的假设、约束、策略及依赖都被记录在本文档了。_需求规格说明书检查表

VMware虚拟机搭建Centos7,并配置网卡,远程连接_vmware workstation centos 7 网卡配置-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏9次。VMware虚拟机搭建Centos7,并配置网卡,实现远程连接_vmware workstation centos 7 网卡配置

简单操作用R Markdown生成HTML和PDF文件_rmarkdown转出pdf总是html形式-程序员宅基地

文章浏览阅读1.4w次,点赞5次,收藏70次。文章目录Output formatsPDFHTMLOutput formatsRMarkdown通过knitr来将代码块运行并与.Rmd文件中文本内容合并生成.md文件后通过Pandoc这个强大的工具再转换成不同的格式,已经支持的格式已经有这么多啦:beamer_presentationgithub_documenthtml_documentioslides_prese..._rmarkdown转出pdf总是html形式