Fastjson

1、简介

1.1 Fastjson 简介

  • Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
  • Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。
  • Fastjson 源码地址:https://github.com/alibaba/fastjson
  • Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN

1.2 Maven依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wujiang.test</groupId>
    <artifactId>test</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <fastjson_version>1.2.28</fastjson_version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson_version}</version>
        </dependency>
    </dependencies>
</project>

2、JSON.toJSONString

2.1 将Java对象转化为Json字符串

  • JSON.toJSONString() 将Java对象转化为Json字符串
  • 使用 @JSONField 注解,其作用对象有两个
    • 配置在Field上(字段)
    • 配置在setter 和 getter 方法上
public class A {
      @JSONField(name="ID")
      private int id;
 
      public int getId() {return id;}
      public void setId(int value) {this.id = id;}
 }
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;}
}
  • 注意:FastJson 在进行操作时,是根据 getter 和 setter 的方法进行的,并不是依据 Field 进行。
  • 注意:若属性是私有的,必须有 set 方法,否则无法反序列化

定义以下 Person JavaBean:

package org.Json_;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Data
@AllArgsConstructor
public class Person {
    @JSONField(name="SEX", serialize=false)
    private String sex;

    @JSONField(name = "AGE", ordinal = 2)
    private int age;

    @JSONField(name = "FULL NAME", ordinal = 1)
    private String fullName;

    @JSONField(name = "DATE OF BIRTH",format="dd/MM/yyyy", ordinal = 3)
    private Date dateOfBirth;

    public Person(){

    }

    public Person(int age, String fullName, Date dateOfBirth) {
        this.age = age;
        this.fullName= fullName;
        this.dateOfBirth = dateOfBirth;
    }

    // 一定要确保有setter与getter方法,否则输出不符合预期:[{},{}]
    // 使用@Data注解就是为了保证有setter与getter方法

    public static void main(String[] args) {
        List<Person> listOfPersons = new ArrayList();
        Person p1 = new Person("男", 15, "John Doe", new Date());
        listOfPersons.add(p1);
        Person p2 = new Person("女", 20, "Janette Doe", new Date());
        listOfPersons.add(p2);

        /**
         * Case 1、使用 JSON.toJSONString() 将 Java 对象转换换为 JSON 对象
         *  - 默认 fastjson 序列化一个 java bean,是根据 fieldName 的字母序进行序列化的,你可以通过 ordinal 指定字段的顺序
         *  - 使用format 参数用于格式化 date 属性
         *  - 默认情况下, FastJson 库可以序列化 Java bean 实体, 但我们可以使用 serialize 指定字段不序列化。
         */
        String jsonOutput= JSON.toJSONString(listOfPersons);
        System.out.println(jsonOutput);

		 /**
         * Case 2、如果需要将转换为json字符串的List的转回来,需要使用JSON.parseArray方法
         */
        List<Person> jsonStrToList = JSON.parseArray(jsonOutput,Person.class);
        System.out.println(jsonStrToList);
        System.out.println(jsonStrToList.get(1).getFullName());
        
		/**
         * Case 3、FastJson 还支持 BeanToArray 序列化功能:
         */
        String jsonOutputArray= JSON.toJSONString(listOfPersons, SerializerFeature.BeanToArray);
        System.out.println(jsonOutputArray);
    }
}

Case 1:从下面👇的输出结果可以看出,若对字段sex不进行序列化,得到的结果中没有该字段:

 @JSONField(name="SEX", serialize=false)
 private String sex;
[{"FULL NAME":"John Doe","AGE":15,"DATE OF BIRTH":"15/08/2021"},{"FULL NAME":"Janette Doe","AGE":20,"DATE OF BIRTH":"15/08/2021"}]


 @JSONField(name="SEX")
 private String sex;
[{"SEX":"男","FULL NAME":"John Doe","AGE":15,"DATE OF BIRTH":"15/08/2021"},{"SEX":"女","FULL NAME":"Janette Doe","AGE":20,"DATE OF BIRTH":"15/08/2021"}]

Case 2: 在对性别sex不序列化的情况下,如果需要将转换为json字符串的List的转回来,需要使用JSON.parseArray方法

[Person(sex=null, age=15, fullName=John Doe, dateOfBirth=Sun Aug 15 00:00:00 CST 2021), Person(sex=null, age=20, fullName=Janette Doe, dateOfBirth=Sun Aug 15 00:00:00 CST 2021)]
Janette Doe

2.2 FastJson 还支持 BeanToArray 序列化功能

  • JSON.parseObject(),是将Json字符串转化为相应的对象
String jsonOutputArray= JSON.toJSONString(listOfPersons, SerializerFeature.BeanToArray);

Case 3: 在对性别sex不序列化的情况下,得到的输出为:

[["John Doe",15,"15/08/2021"],["Janette Doe",20,"15/08/2021"]]

3、JSON.parseObject


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.Date;

@Data
@AllArgsConstructor
public class Person_reverse {
    @JSONField(name="SEX", serialize=false)
    private String sex;

    @JSONField(name = "AGE", ordinal = 2)
    private int age;

    @JSONField(name = "NAME", ordinal = 1)
    private String fullName;

    @JSONField(name = "BIRTH",format="dd/MM/yyyy", ordinal = 3, deserialize = false)
    private Date dateOfBirth;

    public Person_reverse(){

    }



    public static void main(String[] args) {

        /**
         * 使用 JSON.parseObject() 将 JSON 字符串转换为 Java 对象。
         *  - 注意反序列化时为对象时,必须要有默认无参的构造函数,否则会报异常
         *  - @JSONField deserialize 可以指定字段不反序列化
         */
        Person_reverse person = new Person_reverse("男", 20, "John Doe", new Date());
        // 指定字段不序列化,所以在Json字符串中没有sex
        String jsonObject = JSON.toJSONString(person);
        System.out.println(jsonObject);  // {"NAME":"John Doe","AGE":20,"BIRTH":"15/08/2021"}

        // 指定字段不反序列化,所以dateOfBirth为null
        Person_reverse newPerson = JSON.parseObject(jsonObject, Person_reverse.class);
        System.out.println(newPerson);  // Person_reverse(sex=null, age=20, fullName=John Doe, dateOfBirth=null)

        System.out.println("----------------------------------------------");

        /**
         * 故意在Json字符串中多了一个Temp,少了一个Person中的dateOfBirth
         *  - 这里的key值要与@JSONField(name = "NAME")中的值对应(不区分大小写)
         */
        String jsonString = "{sex:'女', age:'100', name:'A B', telephone:'88888'}";
        // 对于Person_reverse类有的属性,而Json字符串中没有,会为null
        // 对于Json字符串有的属性,而Person_reverse类有的属性,不做任何处理
        Person_reverse instance = JSON.parseObject(jsonString, Person_reverse.class);
        System.out.println(instance);    // Person_reverse(sex=女, age=100, fullName=A B, dateOfBirth=null)


        String jsonStr = JSON.toJSONString(instance);
        System.out.println(jsonStr);      // {"NAME":"A B","AGE":100}
    }

}

输出为:

{"NAME":"John Doe","AGE":20,"BIRTH":"15/08/2021"}
Person_reverse(sex=null, age=20, fullName=John Doe, dateOfBirth=null)
----------------------------------------------
Person_reverse(sex=, age=100, fullName=A B, dateOfBirth=null)
{"NAME":"A B","AGE":100}

参考:https://www.runoob.com/w3cnote/fastjson-intro.html
参考:https://blog.csdn.net/antony9118/article/details/71023009

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还能坚持

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值