fastjson属性名设置为PascalCase、SnakeCase、KebabCase策略的正确姿势

官方解释:https://github.com/alibaba/fastjson/wiki/PropertyNamingStrategy_cn

fastjson缺省使用CamelCase,在1.2.15版本之后,fastjson支持配置PropertyNamingStrategy,支持如下四种:

name demo
CamelCase persionId
PascalCase PersonId
SnakeCase person_id
KebabCase person-id

使用方式1

SerializeConfig config = new SerializeConfig(); // 生产环境中,config要做singleton处理,要不然会存在性能问题
config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;

Model model = new Model();
model.personId = 1001;
String text = JSON.toJSONString(model, config);
Assert.assertEquals("{\"person_id\":1001}", text);

ParserConfig parserConfig = new ParserConfig(); // 生产环境中,parserConfig要做singleton处理,要不然会存在性能问题
parserConfig.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
Model model2 = JSON.parseObject(text, Model.class, parserConfig);
Assert.assertEquals(model.personId, model2.personId);

(1)可以写线程安全的单例工具类

(2)可以通过springxml方式或者java config方式构造单例的SerializeConfig的bean,在需要的地方注入使用即。建议命名为对应风格名称+SerializeConfig,如snakeCaseSerializeConfig。

使用方式2:基于JSONType配置PropertyNamingStrategy

@JSONType(naming=PropertyNamingStrategy.SnakeCase)
public class Cat {

    private String name;

    private Integer age;

    private String sex;

    private String testThis;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getTestThis() {
        return testThis;
    }

    public void setTestThis(String testThis) {
        this.testThis = testThis;
    }
}
public class FastJsonTest {
    @Test
    public void propertyNamingStrategyTest(){
        Cat cat = new Cat();
        cat.setName("张三");
        cat.setAge(0);
        cat.setSex("male");
        cat.setTestThis("testIt");

        Assert.assertEquals("{\"age\":0,\"name\":\"张三\",\"sex\":\"male\",\"test_this\":\"testIt\"}", JSON.toJSONString(cat) );
    }
}

方式3:Spring单例bean方式

@Configuration
public class FastJsonSerializeConfig {

    @Bean("snakeCaseSerializeConfig")
    @Scope("singleton")
    public SerializeConfig snakeCaseSerializeConfig() {
        SerializeConfig config = new SerializeConfig();
        config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
        return config;
    }

    @Bean("pascalCasSerializeConfig")
    @Scope("singleton")
    public SerializeConfig pascalCasSerializeConfig() {
        SerializeConfig config = new SerializeConfig();
        config.propertyNamingStrategy = PropertyNamingStrategy.PascalCase;
        return config;
    }
}

单元测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class FastJsonTest {

    @Resource(name = "snakeCaseSerializeConfig")
    private SerializeConfig snakeCaseSerializeConfig;
    @Resource(name = "pascalCasSerializeConfig")
    private SerializeConfig pascalCasSerializeConfig;

  
    @Test
    public void propertyNamingStrategyTest2(){

        Cat cat = new Cat();
        cat.setName("张三");
        cat.setAge(0);
        cat.setSex("male");
        cat.setTestThis("testIt");
        System.out.println(JSON.toJSONString(cat,pascalCasSerializeConfig));

        System.out.println(JSON.toJSONString(cat,snakeCaseSerializeConfig));

        Assert.assertEquals("{\"age\":0,\"name\":\"张三\",\"sex\":\"male\",\"test_this\":\"testIt\"}", JSON.toJSONString(cat,snakeCaseSerializeConfig) );
    }
    
}

修改全局缺省的命名策略

SerializeConfig.getGlobalInstance()
               .propertyNamingStrategy = PropertyNamingStrategy.PascalCase;

另外由于fastjson的策略是枚举方式,暂时不支持自定义新的统一的属性名策略,如果有其他需求可以通过

@JSONField(name = "xxx")来指定每个属性的名称。

猜你喜欢

转载自blog.csdn.net/w605283073/article/details/83451554