比如我现在有个Student对象,我用gson.tojson() 返回List<Student>有个问题
就是issueddatefmt 字段其实是根据issueddate进行格式化,返回对应的字符串
但是测试发现返回的就是我设置的默认值201-1-1  那个字段不是private 类型吗 
就是按照反射原理 也应该是调用getIssueddatefmt 获取该值吧? gson怎么能读取private的值呢??public class Student
{
  private Date issueddate;
  private String issueddatefmt = "2017-1-1";
  
 public String getIssueddatefmt(){
        if (issueddate == null)
        {
            return "";
        }
        else
        {
            SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
            String fmtstr = ft.format(issueddate);
            return fmtstr;
        }
    }
}

解决方案 »

  1.   


    在创建gson对象时就对日期进行格式化,不用这么麻烦
    public Gson createGson(){
    return new GsonBuilder()
    .excludeFieldsWithoutExposeAnnotation() //不导出实体中没有用@Expose注解的属性  
            .enableComplexMapKeySerialization() //支持Map的key为复杂对象的形式  
            .serializeNulls().setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")//时间转化为特定格式    
            .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写,注:对于实体上使用了@SerializedName注解的不会生效.  
            .setPrettyPrinting() //对json结果格式化.  
            .setVersion(1.0)    //有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化.  
                                //@Since(版本号)能完美地实现这个功能.还的字段可能,随着版本的升级而删除,那么  
                                //@Until(版本号)也能实现这个功能,GsonBuilder.setVersion(double)方法需要调用.  
            .create(); 
    }
      

  2.   

    谢谢回复  可是我现在就是有这种需求怎么办? 而不是在原有Date属性字段进行格式化 而是增加一个字段(可以根据各种情况自定义内容),两个字段回传到页面都有用处。
      

  3.   

    感觉java的这个序列化不如.NET方便啊
    刚开始觉得java都是通过调用get set方法设置字段值 字段值一般就是private
    可是我发现在序列化是直接根据字段值去序列化结果 这个不科学啊!  应该根据对应的get方法获取值去序列化才对啊!.NET就是的 
    这样你就可以在get的时候自定义一些格式输出 不然你一个数据集你想增加一个格式化字段输出 还得先遍历一遍  先给这几个字段赋值 然后才能输出 这就有效率问题了
    请大神指点下