Closed werson closed 1 month ago
同issue https://github.com/alibaba/fastjson2/issues/2825 JSONFactory.getDefaultObjectWriterProvider().setNamingStrategy(PropertyNamingStrategy.CamelCase1x)
这其实不算 bug,因为 Java Bean 规范就是这么规定的。
对象的规范属性名称,不是根据 private
的 字段名称来确定的,而是根据 public
的 getter 方法的名称来确定的。
如果你的 getter 方法名为 getABcd()
,去掉 get
前缀就是 "ABcd"。
根据 JavaBean 规范,如果第二个字母是大写的,第一个就不需要转为小写。比如 getCPU()
,解析出来的属性名称就是 CPU
。
同理,getABcd()
解析出来就是 ABcd
。
你可以参考 JDK 自带的 java.beans.Introspector.decapitalize("ABcd")
方法的输出结果及源代码:
/**
* Utility method to take a string and convert it to normal Java variable
* name capitalization. This normally means converting the first
* character from upper case to lower case, but in the (unusual) special
* case when there is more than one character and both the first and
* second characters are upper case, we leave it alone.
* <p>
* Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays
* as "URL".
*
* @param name The string to be decapitalized.
* @return The decapitalized version of the string.
*/
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);
}
如果您就是想保持属性名称为原始的字段名称,即"aBcd",那么可以用以下任一办法解决:
getaBcd()
@JSONField(name = "aBcd")
(定义为任意有效名称都可以)。JSONWriter.Feature.FieldBased
来强制忽略所有 getter,仅根据字段输出,例如:JSON.toJSONString(obj, JSONWriter.Feature.FieldBased)
问题描述
简要描述您碰到的问题。 JSON.toJSONString
public static void main(String[] args) { ATestClass vo = ATestClass.builder().rMepId(2).build(); System.out.println(com.alibaba.fastjson2.JSON.toJSONString(vo)); }
环境信息
请填写以下信息:
重现步骤
如何操作可以重现该问题:
xxx.xxx
方法...
数据...
错误期待的正确结果
对您期望发生的结果进行清晰简洁的描述。
相关日志输出
请复制并粘贴任何相关的日志输出。
附加信息
如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。