class TestVo(){
//JSON.toJSONString()会转换为PName private String pName; //JSON.toJSONString()转化正常 private String proName;
}
public void testJSONToString(){ TestVo testVo = new TestVo(); testVo.setPName("test"); testVo.setProName("test1"); System.out.println(JSON.toJSONString(vo)); //期望输出: {"pName":"test", "proName":"test1"} //实际输出: {"PName":"test", "proName":"test1"} }
问题补充:
使用lomok时,set方法为setPName(), 转换异常 正常生成的set方法为setpName(),能够正常转换 使用兼容版本的JSON.toJSONString(),两种方式都能正常转换
原提问者GitHub用户gsmoking
现在的实现是参考java.beans.Introspector#decapitalize方法:
package java.beans;
public class Introspector { 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); }
}
fastjson 1.x的实现,一直有人反馈说不对,希望和java.beans.Introspector#decapitalize方法一致,为了保证兼容一直没改。现在是2.0就改了。
下面分别是fastjson2、jackson、fastjson1、gson的结果,各不相同,如下:
// fastjson2 {"PName":"test"}
// jackson {"pname":"test"}
// fastjson1 & gson {"pName":"test"}
你可以通过配置JSONField输出你要的,或者你用最新版本的2.0.13-SNAPSHOT版本,然后把field声明为public,比如:
@Data public class Bean1 { public String pName; }
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。