java 命名规范 json大小写_JSON.toJSONString会把key的首字母转成小写

当使用Fastjson的JSON.toJSONString方法转换JavaBean到JSON时,发现字段首字母自动变为小写。这源于Java的内省机制和Fastjson的兼容性设置。解决方法包括:修改bean属性为public并遵循JavaBean规范,使用@JSONField注解指定字段映射,或自定义Object2Json和list2Json方法。此外,Fastjson提供了一些配置选项以控制转换行为,如QuoteFieldNames、WriteMapNullValue等。
部署运行你感兴趣的模型镜像

一个项目需求要求返回值为JSON格式,且大多数字段是首字母大写,还有些是类似N_TX这样的格式,在输出这样的结果时遇到了问题,由于时间紧,就直接拷贝需要的结果字段建立JavaBean类,本以为最后直接调用JSON.toString(obj)返回结果即可,没想到返回值中自动将首字母变小写。查看fastjson源码发现关键在下面一段

public static List computeGetters(Class> clazz, Map aliasMap, boolean sorted) {

String propertyName;

if (Character.isUpperCase(c3)) {

if (compatibleWithJavaBean) {

propertyName = Introspector.decapitalize(methodName.substring(3));

} else {

propertyName = Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4);

}

} else if (c3 == '_') {

propertyName = methodName.substring(4);

} else if (c3 == 'f') {

propertyName = methodName.substring(3);

} else {

continue;

}

}

// 在compatibleWithJavaBean为false时直接get对应属性首字母小写,考虑将compatibleWithJavaBean初始化为true,发现

public static String decapitalize(String name) {

if (name == null || name.length() == 0) {

return name;

}

if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&

Character.isUpperCase(name.charAt(0))) {

return name;

}

char chars[] = name.toCharArray();

chars[0] = Character.toLowerCase(chars[0]);

return new String(chars);

}

//只能在连续的大写字母情况下才不进行首字母变小写操作。故此方法也不满足要求。

根本原因: java 的内省机制

内省(Introspector)是Java 语言对Bean类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。 一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量,通过去掉set方法前缀,然后取剩余部分,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小写。参考:http://blog.csdn.net/hahalzb/article/details/5972421

如何解决

1、直接将bean对象中的属性改为public,属性名命名为首字母大写,比如{"Name":"nomouse","Age":12},定义相应的bean为:熟悉为public,不需要定义get方法

public class User {

public String Name;

public int Age;

}

2、第一种方法不符合Java的命名规范,可以用第二种方法,在属性上添加注解:

public class User {

@JSONField (value = "Name")

private String name;

@JSONField(value = "Age")

private int age;

}

3、自己利用反射写Object2Json和list2Json方法,只要能对简单的JavaBean类处理即可。

DisableCheckSpecialChar:一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false

QuoteFieldNames———-输出key时是否使用双引号,默认为true

WriteMapNullValue——–是否输出值为null的字段,默认为false

WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null

WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null

WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null

WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值