Fastjson首字母大小写问题

博客讲述了在项目中遇到Fastjson替换org.json后,由于Fastjson默认将首字母转换为小写导致的问题。文章提供了两种解决方法:1) 设置`compatibleWithJavaBean`为true;2) 使用`@JSONField`注解指定字段名称。通过分析Fastjson源码,了解到此行为是由于`compatibleWithJavaBean`默认为false引起的。
摘要由CSDN通过智能技术生成

Fastjson首字母大小写问题

最近由于项目里用到了多个json类库,fastjson,org.json,jackson都有用到,最终把json类库统一成了API最为简单的Fastjson。
Fastjson替换org.json之后导致部分功能不可用,最终确定为fastjson的默认首字母小写机制造成的。

maven依赖

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

测试代码

// 省略get set

public class Student {
    private String ID;
    private String NAME;
    private String ADDREDD;
}

测试代码

import com.alibaba.fastjson.JSON;

public class FastjsonTest {
    public static void main(String[] args) {
        Student student = new Student();
        student.setID("123");
        student.setNAME("zhangsan");
        student.setADDREDD("shanghai");
        String s = JSON.toJSONString(student);
        System.out.println(s);
    }
}
{"aDDREDD":"shanghai","iD":"123","nAME":"zhangsan"}

解决办法

1.compatibleWithJavaBean设置为true

TypeUtils.compatibleWithJavaBean = true;

也可以通过设置jvm参数。

2.@JSONField注解

public class Student {
    @JSONField(name = "ID")
    private String ID;
    @JSONField(name="NAMW")
    private String NAME;
    @JSONField(name = "ADDRESS")
    private String ADDREDD;
}
{"ADDRESS":"shanghai","ID":"123","NAMW":"zhangsan"}

问题分析

通过查看Fastjson源码可知,Fatjson在序列化对象时,会判断compatibleWithJavaBean,如果为fals则将首字母小写,compatibleWithJavaBean默认值为false.

ublic class TypeUtils {
    private static final Pattern NUMBER_WITH_TRAILING_ZEROS_PATTERN = Pattern.compile("\\.0*$");
    public static boolean compatibleWithJavaBean = false;
    public static boolean compatibleWithFieldName = false;
...
}
...
if (Character.isUpperCase(c2)) {
    if (compatibleWithJavaBean) {
        propertyName = decapitalize(methodName.substring(2));
    } else {
     propertyName = Character.toLowerCase(methodName.charAt(2)) + methodName.substring(3);
    }
propertyName = getPropertyNameByCompatibleFieldName(fieldCacheMap, methodName, propertyName, 2);
...

参考资料

https://github.com/alibaba/fastjson/issues/373

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
fastjson2 是一个Java语言编写的JSON解析库,可以实现JSON字符串与Java对象之间的相互转换。在fastjson2中,反序列化大小写是指在将JSON字符串转换为Java对象时,对于属性名的大小写敏感性。 在默认情况下,fastjson2是大小写敏感的,即JSON字符串中的属性名必须与Java对象中的属性名完全匹配,包括大小写。如果属性名大小写不匹配,fastjson2会无法正确地将JSON字符串转换为Java对象。 而,fastjson2也提供了一些配置选项来实现反序列化大小写不敏感的功能。可以通过以下两种方式来实现: 1. 使用@JSONField注解:可以在Java对象的属性上使用@JSONField注解,并设置name属性来指定对应的JSON属性名。通过设置name属性为大小写不敏感的值,可以实现反序列化大小写不敏感的效果。 示例代码如下: ```java public class User { @JSONField(name = "username") private String userName; // getter and setter } ``` 2. 使用ParserConfig配置:可以通过ParserConfig类来配置fastjson2的解析器,设置属性名的大小写敏感性。可以使用ParserConfig.getGlobalInstance()方法获取全局的ParserConfig实例,并调用setFieldBased()方法设置属性名大小写不敏感。 示例代码如下: ```java ParserConfig config = ParserConfig.getGlobalInstance(); config.setFieldBased(true); ``` 通过以上两种方式,可以实现fastjson2反序列化大小写不敏感的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pandamig

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值