开发者社区> 问答> 正文

fastjson 2 首字母为单个字母的驼峰转换问题

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(),两种方式都能正常转换

提问35.png

提问36.png

原提问者GitHub用户gsmoking

展开
收起
飘飘斯嘉丽 2023-04-21 11:22:35 185 0
1 条回答
写回答
取消 提交回答
  • 现在的实现是参考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

    2023-04-21 14:19:26
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载