【Java 笔记】使用Fastjson2时,对象转json首字母大小写问题

2023-10-28

开发环境:

一、JSON 转 Object

1.问题:

2.解决方案

二、Object转 JSON

三、SpringBoot设置fastjson2 为默认

pom.xml

2. 配置类

四、FastJson2 注解

默认

2. @JSONType 类注解

3. @JSONField(name = "othername") 属性注解

五、思考问题

Java 对象为什么需要序列化?

为什么对象没有实现Serializable接口,也可以使用Fastjson序列化?


开发环境:

  • Spring cloud

  • Fastjson2

一、JSON 转 Object

  • 推送第三方数据时,对方http接口消息体为json,但是字段首字母大写

  • 我们需要接收JSON 转 Object

[

{

"ItemCode": "WIND_SPEED",

"ItemValue": "2.1",

"WorkTime": "20230104165400",

"Remark": "风速(m/s)"

}

]

  • 返回结果首字母大写:

{"Status": "1","Msg": "服务调用处理成功"}

1.问题:

序列化和反序列化时字段首字母自动变成小写:如


@Data
@Slf4j
@AllArgsConstructor
@NoArgsConstructor
public class Item {
    private String ItemCode;
    private String ItemValue;
    private String WorkTime;
    private String Remark;
}

@Data
@Slf4j
@AllArgsConstructor
@NoArgsConstructor
public class RspResult {
    private String Status;
    private String Msg;
}

  • 序列化使用 JSON.toJSONString(Object object),首字母自动变成小写

[

{

"itemCode": "WIND_SPEED",

"itemValue": "2.1",

"workTime": "20230104165400",

"remark": "风速(m/s)"

}

]

  • 反序列化:使用 JSON.parseObject(String text, Class<T> clazz) 转换出对象为null

  • text为 {"Status": "1","Msg": "服务调用处理成功"}

  • clazz 为 {"status": null,"msg": null}

2.解决方案

  • 使用 @JSONField(name = "ItemCode") 或 @JsonProperty("ItemCode")

  • Java代码中元素首字母必须小写,否则@JSONField@JsonProperty失效

如 private String itemCode;

二、Object转 JSON

  • 我们提供接口,返回JSON字段首字母大写

这里SpringBoot默认使用Jackson,所以用 @JsonProperty

@JsonProperty

@JSONField

JSON.toJSONString(Object object)

生效

生效

接口返回Object

生效

不生效

(因为spring boot默认Jackson

三、SpringBoot设置fastjson2 为默认

注意:千万不要在老项目中修改,否则你返回的字段会有问题,如下

字段名

Jackson(无注解)

fastjson2(无注解)

eName

eName(不变

EName

  1. pom.xml

<!-- pom.xml -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <!-- 去掉Jackson依赖,用fastjson -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-json</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.6</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2-extension</artifactId>
            <version>2.0.6</version>
            <!-- <version>${fastjson2.version}</version> -->
        </dependency>

2. 配置类


import com.alibaba.fastjson2.support.spring.http.converter.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.ArrayList;
import java.util.List;


@Configuration
public class JsonMessageConverterConfigurer implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        // 自定义配置...
        // FastJsonConfig config = new FastJsonConfig();
        // config.set...
        // converter.setFastJsonConfig(config);

        // spring boot高版本无需配置,低版本不配置报错:Content-Type cannot contain wildcard type '*'
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON);
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        converter.setSupportedMediaTypes(fastMediaTypes);

        converters.add(0,converter);
    }
}

四、FastJson2 注解

  1. 默认

代码

是否返回null字段

JSON.toJSONString(Object)

接口 return Object

JSON.toJSONString(Object,JSONWriter.Feature.WriteMapNullValue)

类注解@JSONType(serializeFeatures = JSONWriter.Feature.WriteMapNullValue)

2. @JSONType 类注解

代码

描述

@JSONType(serializeFeatures = JSONWriter.Feature.WriteMapNullValue)

返回null字段

3. @JSONField(name = "othername") 属性注解

代码

描述

@JSONField(name = "Temperature")

private String temperature;

字段重命名Temperature

注意:属性首字母必须小写否则@JSONField失效

五、思考问题

  1. Java 对象为什么需要序列化?
  1. 为什么对象没有实现Serializable接口,也可以使用Fastjson序列化?

详情请移步 【Spring】1.Java对象序列化和反序列化

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java 笔记】使用Fastjson2时,对象转json首字母大小写问题 的相关文章

随机推荐

  • 【AI实战】快速搭建中文 Alpaca 33B 大模型 Chinese-Alpaca-33B

    AI实战 快速搭建中文 Alpaca 33B 大模型 Chinese Alpaca 33B 中文 33B 大模型 Chinese Alpaca 33B 环境配置 搭建过程 1 拉取 chinese alpaca lora 33b 2 合并l
  • 【python学习笔记】seaborn模块

    目录 热力图介绍 seaborn模块绘制热力图 热力图介绍 热力图是一种特殊的图表 它是一种通过对色块着色来显示数据的统计图表 在绘图时 需要指定每个颜色映射的规则 一般以颜色的强度或色调为标准 比如颜色越深的表示数值越大 程度越深 颜色越
  • spark运行报错:(null) entry in command string: null chmod 0644

    在WIndows操作系统中本地运行spark程序 报以下错误 null entry in command string null chmod 0644 后面是目的目录 解决方法 下载hadoop dll文件 并拷贝到c windows sy
  • JS中的call()和apply()方法和区别

    一 方法定义 apply 调用一个对象的一个方法 用另一个对象替换当前对象 例如 B apply A arguments 即A对象应用B对象的方法 call 调用一个对象的一个方法 用另一个对象替换当前对象 例如 B call A args
  • 分析996个词根在各大考纲词汇中的作用(五)总结精选篇

    CET4 CET6 GRE IELTS TOEFL 考研英语总的词汇量为14055 分析词根总数为996 有11544个单词分布在这些词根中 剩下的2511个词汇没有任何词根信息 本文精选5206个跟词根结合最紧密的单词 superword
  • KVM的HVM虚拟机使用非串口方式建立virsh console 连接

    在去年写的文章中 http blog csdn net dobell article details 14442457 写到了怎么利用serial 设备进行console连接 不过比较麻烦 因为1 需要修改虚拟机内部的grub启动选项 2
  • unity学习笔记-有关打包安卓apk的一些注意事项

    unity学习笔记 有关打包安卓apk的一些注意事项 打包到build project的时候报错 报错信息里出现了jdksdk等 打包报错显示andriodfestxml文件版本有问题 有关urp线管环境打包的时候的一些注意事项 在编辑器里
  • 一款开源的文件搜索神器,终于不用记 find 命令了

    Python微信订餐小程序课程视频 https blog csdn net m0 56069948 article details 122285951 Python实战量化交易理财系统 https blog csdn net m0 5606
  • pppd程序的参数——man手册翻译

    文章目录 pppd全称 摘要 描述 常用的选项 ttyname 串口名 speed 波特率 asyncmap map auth call name connect script 连接脚本 crtscts defaultroute defau
  • chatgpt赋能python:Python处理Word文档

    Python处理Word文档 介绍 Microsoft Word是业界最流行的办公文档编辑工具之一 对于文档处理工作 Word是必不可少的工具之一 然而 尽管Word是十分强大的 但在处理大量数据时 手动处理每个文件是费时费力的 幸运的是
  • 数值分析——LU分解(LU Factorization)

    本系列整理自博主21年秋季学期本科课程 数值分析I 的编程作业 内容相对基础 参考书 David Kincaid Ward Cheney Numerical Analysis Mathematics of Scientific Comput
  • Python 多线程 start()和run()方法的区别(三)

    在实例调用的函数中加入打印当前线程的名字 分别用start 方法和run 方法启动线程检查有什么区别 start 方法 import threading import time def worker count 1 while True i
  • Linux epoll 与 Windows IOCP比较

    前言 epoll 和 IOCP IO Completion Ports 分别是 Linux 和 Windows 系统上的高效网络模型 相比其他网络模型 同样是 polling 方式 这两种模型有如下特点 在系统资源允许下 监控的文件描述符没
  • pandas中to_datetime()时间处理

    pandas to datetime arg errors raise utc None format None unit None pandas通常用于处理成组日期 不管这些日期是DataFrame的轴索引还是列 to datetime方
  • 入职字节外包一个月,我离职了····

    有一种打工人的羡慕 叫做 大厂 真是年少不知大厂香 错把青春插稻秧 但是 在深圳有一群比大厂员工更庞大的群体 他们顶着大厂的 名 做着大厂的工作 还可以享受大厂的伙食 却没有大厂的 命 他们就是大厂的 外包员工 什么都做了 和什么都没做其实
  • idea注释快捷键

    具体实现步骤 1 打开系统设置Setting Ctrl Alt S快捷键 2 Editor gt Live Templates gt 点击 号 添加一个templates group来放置自己快捷键 效果图如下 3 选中创建的group g
  • 在Excel VBA中使用字典

    序言 VBA的基础数据类型里面并没有字典类型 但字典其实在很多应用场景中都很有用 那么如何在VBA中使用字典 本文就用几个例子和大家交流探讨一下 场景1 某个医院每天都会从不同的制造商那里进三种材料中的一种 每天的进价都有可能不同 现在公司
  • NodeRed-第三篇:tcp接入

    1 用tcp in节点接入数据 设置为监听 设置端口号 设置输出为buffer 2 用function节点将buffer转换为string var a msg payload msg payload a return msg 3 用json
  • Android语音识别

    今天从网上找了个例子实现了语音识别 个人感觉挺好玩的 就把代码贴出来与大家分享下 Android中主要通过RecognizerIntent来实现语音识别 其实代码比较简单 但是如果找不到设置 就会抛出异常ActivityNotFoundEx
  • 【Java 笔记】使用Fastjson2时,对象转json首字母大小写问题

    开发环境 一 JSON 转 Object 1 问题 2 解决方案 二 Object转 JSON 三 SpringBoot设置fastjson2 为默认 pom xml 2 配置类 四 FastJson2 注解 默认 2 JSONType 类