fastJson

本文介绍了FastJson这个Java库,详细阐述了如何使用@JSONField进行自定义转换,包括格式化日期、控制字段排序和序列化标记。还讲解了如何创建JSON对象、将JSON转换为Java对象,以及通过ContextValueFilter和NameFilter进行高级配置,例如隐藏特定字段或修改字段名称。

FastJson

Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
导入依赖

com.alibaba
fastjson
x.x.x

//定义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;
    }
}
//使用JSON.toJSONString()将java对象转换为json对象
private List<Person> listOfPerson = new ArrayList<Person>();
@Before //标注用于指明此方法应当在测试用例类中的每个测试方法开始运行之前调用。
public void setup(){
    ListOfPerson.add(new Person(15,"John doe",new Date()));
    ListOfPerson.add(new Person(30,"Janes",new Date()));

}

@Test
Public void whenJavaList_thanConverToJsonCorrect(){
    String jsonOutPut = JSON.toJSONString(listOfPerson);
}

输出结果为:
[
{
“AGE”:15,
“DATE OF BIRTH”:1468962431394,
“FULL NAME”:“John Doe”
},
{
“AGE”:20,
“DATE OF BIRTH”:1468962431394,
“FULL NAME”:“Janette Doe”
}
]
还可以自定义输出,并控制字段的排序,日期显示格式,序列化标记等。

@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 的作用对象
1.Field
2.Setter 和 Getter 方法

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

JSONField 可以配置在getter/setter方法或者字段上
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.配置在 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(反序列化) 指定字段不序列化
序列化指将一个java对象写入到IO流中,反序列化是指从IO流中恢复该java对象。

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;
}

创建JSON对象

只需使用 JSONObject(fastJson提供的json对象,JSONObject继承了Map<String ,Oject>) 和 JSONArray(fastJson提供json数组对象JSONArray继承了list) 对象即可。

@Test
public void whenGenerateJson_thanGenerationCorrect() throws ParseException{
    for (int i = 0; i < 2; i++) {
    JSONArray jsonArray = new JSONObject();
    jsonObject.put("AGE", 10);
        jsonObject.put("FULL NAME", "Doe " + i);
        jsonObject.put("DATE OF BIRTH", "2016/12/12 12:12:12");
        jsonArray.add(jsonObject);
    }
    String jsonOutput = jsonArray.toJSONString();
}

输出结果为
[
{
“AGE”:“10”,
“DATE OF BIRTH”:“2016/12/12 12:12:12”,
“FULL NAME”:“Doe 0”
},
{
“AGE”:“10”,
“DATE OF BIRTH”:“2016/12/12 12:12:12”,
“FULL NAME”:“Doe 1”
}
]

JSON对象转换为Java对象

@Test
public void whenJson_thanConvertToObjectCorrect() {
    Person person = new Person(20, "John", "Doe", new Date());
    String jsonObject = JSON.toJSONString(person);
    Person newPerson = JSON.parseObject(jsonObject, Person.class);
     
    assertEquals(newPerson.getAge(), 0); // 如果我们设置系列化为 false
    assertEquals(newPerson.getFullName(), listOfPersons.get(0).getFullName());
}

使用JSON.parseObject()将JSON字符串转换为Java对象
反序列化时,必须要有默认的无参的构造函数,否则会报异常
com.alibaba.fastjson.JSONException: default constructor not found.

//简单的实例测试
Person[age=20,fullName=John Doe,dateOfBirth = Wed Jul 20 08:08:08 WEST 2016]
//@JSONField deserialize 可选项可以指定字段不反序列化
@JSONField(name = "DATE OF BIRTH",deserialize=false)
private Date dateOfBirth;
//输出结果为
Person [age = 20,fullName = John Doe, dateOfBirth=null]

使用 ContextValueFilter 配置 JSON 转换

在某些场景下,对Value做过滤,需要获得所属JavaBean的信息,包括类型、字段、方法等。在fastjson-1.2.9中,提供了ContextValueFilter,类似于之前版本提供的ValueFilter,只是多了BeanContext参数可用。

@Test
public void givenContextFilter_whenJavaObject_thanJsonCorrect() {
    ContextValueFilter valueFilter = new ContextValueFilter () {
        public Object process(
          BeanContext context, Object object, String name, Object value) {
            if (name.equals("DATE OF BIRTH")) {
                return "NOT TO DISCLOSE";
            }
            if (value.equals("John")) {
                return ((String) value).toUpperCase();
            } else {
                return null;
            }
        }
    };
    String jsonOutput = JSON.toJSONString(listOfPersons, valueFilter);
}

以上实例中我们隐藏了 DATE OF BIRTH 字段,并过滤名字不包含 John 的字段:
[
{
“FULL NAME”:“JOHN DOE”,
“DATE OF BIRTH”:“NOT TO DISCLOSE”
}
]

使用 NameFilter 和 SerializeConfig

NameFilter: 序列化时修改 Key。
SerializeConfig:内部是个map容器主要功能是配置并记录每种Java类型对应的序列化类。

@Test
public void givenSerializeConfig_whenJavaObject_thanJsonCorrect() {
    NameFilter formatName = new NameFilter() {
        public String process(Object object, String name, Object value) {
            return name.toLowerCase().replace(" ", "_");
        }
    };
     
    SerializeConfig.getGlobalInstance().addFilter(Person.class,  formatName);
    String jsonOutput =
      JSON.toJSONStringWithDateFormat(listOfPersons, "yyyy-MM-dd");
}

声明了formatName过滤器使用NameFilter匿名类来处理字段名称,使用toJSONStringWithDateFormat() 而不是toJSONString(),它可以更快的格式化日期。
输出结果
[
{
“full_name”:“John Doe”,
“date_of_birth”:“2016-07-21”
},
{
“full_name”:“Janette Doe”,
“date_of_birth”:“2016-07-21”
}
]

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值