一个项目需求要求返回值为JSON格式,且大多数字段是首字母大写,还有些是类似N_TX这样的格式,在输出这样的结果时遇到了问题,由于时间紧,就直接拷贝需要的结果字段建立JavaBean类,本以为最后直接调用JSON.toString(obj)返回结果即可,没想到返回值中自动将首字母变小写。查看fastjson源码发现关键在下面一段

public static List<FieldInfo> computeGetters(Class<?> clazz, Map<String, String> aliasMap, boolean sorted) {
String propertyName;
if (Character.isUpperCase(c3)) {
if (compatibleWithJavaBean) {
propertyName = Introspector.decapitalize(methodName.substring(3));
} else {
propertyName = Character.toLowerCase(methodName.charAt(3)) + methodName.substring(4);
}
} else if (c3 == '_') {
propertyName = methodName.substring(4);
} else if (c3 == 'f') {
propertyName = methodName.substring(3);
} else {
continue;
}}
compatibleWithJavaBean为false时直接get对应属性首字母小写,考虑将compatibleWithJavaBean初始化为true,发现
 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);

}

只能在连续的大写字母情况下才不进行首字母变小写操作。故此方法也不满足要求。 

最后找到以下解决方法:

1、直接将bean对象中的属性改为public,属性名命名为首字母大写,比如{"Name":"nomouse","Age":12},定义相应的bean为:熟悉为public,不需要定义get方法

public class User {

public String Name;

public int Age;

}

2、第一种方法不符合Java的命名规范,可以用第二种方法,在属性上添加注解:

public class User {

@JSONField  (value = "Name")

private String name;

@JSONField(value = "Age")

private int age;

}

3、自己利用反射写Object2Json和list2Json方法,只要能对简单的JavaBean类处理即可。

开始还想看下Fastjson的SerializerFeature序列化属性是否能用上,最后还是没找到合适的:

DisableCheckSpecialChar:一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false
QuoteFieldNames———-输出key时是否使用双引号,默认为true
WriteMapNullValue——–是否输出值为null的字段,默认为false
WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null
WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null
WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null
WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null

最新文章

  1. 在C#代码中应用Log4Net(五)将Log4Net正确地封装在自己的类库中并进行调用
  2. js屏幕尺寸 笔记
  3. C#通过SSH连接MySql
  4. [moka同学笔记]Yii2.0验证码
  5. JavaWeb学习记录(九)——Cookie的增加、删除、查看
  6. php分享表单提交到本页的实例
  7. Android 手机震动 设置震动时间
  8. android moveTaskToback 应用退到后台,类似最小化
  9. codevs 2449 骑士精神 (IDDfs)
  10. mysql命令行执行外部文件
  11. ucos任务控制块详解
  12. maven命令更新子父项目的pom版本
  13. SpringMVC 异常的处理
  14. CTF 文件包含与伪协议
  15. 详谈Javascript类与继承
  16. day 23-1 类的命名空间、组合
  17. ubuntu16.04 安装java
  18. Jmeter安装与使用(压测)
  19. CUDA版Grabcut的实现
  20. HTML页面自动跳转,windows操作

热门文章

  1. JBoss EAP6/AS7/WildFly: How to Use Properties Files Outside Your Archive--reference
  2. [转] 用PDB库调试Python程序
  3. php laravel mysql无法连接处理方案(linux服务器配置)
  4. ubuntu 查看端口被占用并处理
  5. python与数值计算环境搭建
  6. Sublime Text 2 自动开启换行 Word Wrap
  7. drop table xx purge
  8. 从cellForRowAtIndexPath 看cell的重用机制
  9. 六、C# 派生
  10. 1.Weblogic通Eclipse调试配置(Weblogic同Eclipse调试配置技术)