alibaba / fastjson2

🚄 FASTJSON2 is a Java JSON library with excellent performance.
Apache License 2.0
3.69k stars 477 forks source link

[QUESTION]如何让部分的字段使用驼峰命名,其他字段使用蛇形命名呢? #1265

Open xxyz30 opened 1 year ago

xxyz30 commented 1 year ago

比如实体类:

@Data
public class SnakeUserInfo{
    private String username;
    private String userPhone;

    private CamelUserInfo camelInfo;

    @Data
    public static class CamelUserInfo{
        private String camelUsername;
        private String camelUserPhone;
    }

    private String password;
    //etc...
}

我想让CamelUserInfo类下的所有字段保持自己的命名风格(驼峰),而其他的字段都变成蛇形(有很多字段) 预期的json如下

{
    "username": "xxxx",
    "user_phone": "123456789",
    "camel_info": {
        "camelUsername": "xxxx",
        "camelUserPhone": "123456789"
    },
    "password": "123"
}

也就是说对于默认的字段,我想用蛇形,但有特殊的一些字段,我想用驼峰。 但因为字段过多,用@JsonField有点太乱了。 有无好方法?

wenshao commented 1 year ago

https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson2/fastjson2/2.0.27-SNAPSHOT/ 请帮忙用2.0.27-SNAPSHOT版本做如下的验证,看是否满足你的需求:

    @Test
    public void test() {
        Bean bean = new Bean();
        bean.userName = "a";
        bean.groupName = "b";

        NameFilter nameFilter = (Object object, String name, Object value) -> {
            if (object instanceof Bean && name.endsWith("Name")) {
                return PropertyNamingStrategy.SnakeCase.fieldName(name);
            }
            return name;
        };
        String str = JSON.toJSONString(bean, nameFilter);
        assertEquals("{\"groupId\":0,\"group_name\":\"b\",\"userId\":0,\"user_name\":\"a\"}", str);
    }

    public static class Bean {
        public int userId;
        public int groupId;

        public String userName;
        public String groupName;
    }