zoukankan      html  css  js  c++  java
  • FastJSON将Java对象转为json,日期显示时间戳未格式化解决办法

    JSON版本:FastJson

    Java 对象转换为 JSON 格式

    定义以下 Person JavaBean:

    public class Person {
         
        @JSONField(name = "AGE")
        private int age;
     
        @JSONField(name = "FULL NAME")
        private String fullName;
     
        @JSONField(name = "DATE OF BIRTH")
        private Date dateOfBirth;
     
        public Person(int age, String fullName, Date dateOfBirth) {
            super();
            this.age = age;
            this.fullName= fullName;
            this.dateOfBirth = dateOfBirth;
        }
     
        // 标准 getters & setters
    }
    

    可以使用 JSON.toJSONString() 将 Java 对象转换换为 JSON 对象:

    private List<Person> listOfPersons = new ArrayList<Person>();
     
    @Before
    public void setUp() {
        listOfPersons.add(new Person(15, "John Doe", new Date()));
        listOfPersons.add(new Person(20, "Janette Doe", new Date()));
    }
     
    @Test
    public void whenJavaList_thanConvertToJsonCorrect() {
        String jsonOutput= JSON.toJSONString(listOfPersons);
    }
    

    输出结果为:

    [  
        {  
            "AGE":15,
            "DATE OF BIRTH":1468962431394,
            "FULL NAME":"John Doe"
        },
        {  
            "AGE":20,
            "DATE OF BIRTH":1468962431394,
            "FULL NAME":"Janette Doe"
        }
    ]
    

    我们还可以自定义输出,并控制字段的排序,日期显示格式,序列化标记等。

    接下来我们更新 bean 并添加几个字段:

    @JSONField(name="AGE", serialize=false)
    private int age;
     
    @JSONField(name="LAST NAME", ordinal = 2)
    private String lastName;
     
    @JSONField(name="FIRST NAME", ordinal = 1)
    private String firstName;
     
    @JSONField(name="DATE OF BIRTH", format="dd/MM/yyyy", ordinal = 3)
    private Date dateOfBirth;
    

    以上代码中我们列出了基本参数类别,并使用 @JSONField 注解,以便实现自定义转换:

    • *format* 参数用于格式化 date 属性。
    • 默认情况下, FastJson 库可以序列化 Java bean 实体, 但我们可以使用 *serialize* 指定字段不序列化。
    • 使用 *ordinal* 参数指定字段的顺序

    这样,以上输出结果为:

    [
        {
            "FIRST NAME":"Doe",
            "LAST NAME":"Jhon",
            "DATE OF BIRTH":"19/07/2016"
        },
        {
            "FIRST NAME":"Doe",
            "LAST NAME":"Janette",
            "DATE OF BIRTH":"19/07/2016"
        }
    ]
    

    @JSONField

    @JSONField 的作用对象:

    • Field
    • Setter 和 Getter 方法

    注意:FastJson 在进行操作时,是根据 getter 和 setter 的方法进行的,并不是依据 Field 进行。

    注意:若属性是私有的,必须有 set 方法。否则无法反序列化。

    package com.alibaba.fastjson.annotation;
    
    public @interface JSONField {
        // 配置序列化和反序列化的顺序,1.1.42版本之后才支持
        int ordinal() default 0;
    
         // 指定字段的名称
        String name() default "";
    
        // 指定字段的格式,对日期格式有用
        String format() default "";
    
        // 是否序列化
        boolean serialize() default true;
    
        // 是否反序列化
        boolean deserialize() default true;
    }
    

    2. JSONField 配置方式

    FieldInfo 可以配置在 getter/setter 方法或者字段上。例如:

    2.1 配置在 getter/setter 上

    public class A {
          private int id;
     
          @JSONField(name="ID")
          public int getId() {return id;}
          @JSONField(name="ID")
          public void setId(int value) {this.id = id;}
    }
    

    2.2 配置在 field 上

    public class A {
          @JSONField(name="ID")
          private int id;
     
          public int getId() {return id;}
          public void setId(int value) {this.id = id;}
     }
    

    3. 使用format配置日期格式化

    public class A {
          // 配置date序列化和反序列使用yyyyMMdd日期格式
          @JSONField(format="yyyyMMdd")
          public Date date;
     }
    

    4. 使用 serialize/deserialize 指定字段不序列化

    public class A {
          @JSONField(serialize=false)
          public Date date;
     }
    
     public class A {
          @JSONField(deserialize=false)
          public Date date;
     }
    

    5. 使用 ordinal 指定字段的顺序

    默认 fastjson 序列化一个 java bean,是根据 fieldName 的字母序进行序列化的,你可以通过 ordinal 指定字段的顺序。这个特性需要 1.1.42 以上版本。

    public static class VO {
        @JSONField(ordinal = 3)
        private int f0;
    
        @JSONField(ordinal = 2)
        private int f1;
    
        @JSONField(ordinal = 1)
        private int f2;
    }
    
  • 相关阅读:
    Codeforces Round #107 (Div. 1) D Mission Impassable
    Codeforces Round #107 (Div. 1) C Smart Cheater
    Codeforces Round #104 (Div. 1) D Lucky Pair
    Codeforces Round #104 (Div. 1) C Lucky Subsequence
    拓扑排序&&欧拉(回)路
    复习笔记之矩阵快速幂(不定时更新)
    复习笔记之母函数
    树链剖分来一发
    最短路算法略解
    题目记录
  • 原文地址:https://www.cnblogs.com/mengw/p/12179799.html
Copyright © 2011-2022 走看看