• fastjson将bean转成字符串时首字母变小写问题


    一个项目需求要求返回值为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







  • 相关阅读:
    西电大第十六届程序设计竞赛 A-GRE
    浙南联合训练赛 B-Laptops
    STL之multimap
    Python编程练习:平方值格式化
    Python编程练习:使用 turtle 库完成玫瑰花的绘制
    Python编程练习:简单的闹钟提醒
    Python编程练习:使用 turtle 库完成叠边形的绘制
    Python编程练习:使用 turtle 库完成正方形的绘制
    Python编程练习:使用 turtle 库完成六边形的绘制
    Spark 介绍
  • 原文地址:https://www.cnblogs.com/doit8791/p/4743633.html
Copyright © 2020-2023  润新知