zoukankan      html  css  js  c++  java
  • 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







  • 相关阅读:
    How to Create a site at the specified URL and new database (CommandLine Operation)
    Using Wppackager to Package and Deploy Web Parts for Microsoft SharePoint Products and Technologies
    SQL Server Monitor v0.5 [Free tool]
    How to build Web Part
    Deploy web part in a virtual server by developing a Web Part Package file(.cab)
    How to recreate "sites" link if you delete it accidentally
    SharePoint Portal Server管理匿名访问设置
    Monitor sql connection from .Net SqlClient Data Provider
    Brief installation instruction of Sharepoint Portal Server
    How to Use SharePoint Alternate URL Access
  • 原文地址:https://www.cnblogs.com/doit8791/p/4743633.html
Copyright © 2011-2022 走看看