官方解释: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 |
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。
@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) );
}
}
@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")来指定每个属性的名称。