FastJSON指南

FastJSON指南

FastJSON是一个轻量级的Java对象与JSON字符串相互转换的库,这篇文章中我们会阐述一些FastJSON的概念并且在实际中演示FastJSON的应用

配置Maven

<dependency>
    <groupId>com.alibabagroupId>
    <artifactId>fastjsonartifactId>
    <version>1.2.13version>
dependency>

将Java对象转换为JSON字符串

假设我们定义了这样一个Java Bean

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;
    }
 
    // standard getters & setters
}

其中,注解@JSONField是标明在FastJSON在将Java对象转换成字符串时,所要用到的键名.

我们可以通过调用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);
}

我们首先创建了一个Person类的列表,包含两个Person对象,然后将他们转换成了JSON字符串,如下

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

可以看到,他们的字段名称与在Bean定义中注解@JSONField中指明的一样,如果没有指明,则默认会使用Bean中定义的名称

@JSONField注解的作用不仅仅于此,它还可以定义日期的格式,该字段是否转为字符串,该字符串在JSON中的顺序等等.比如我们可以将刚刚的Person类改成这样

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

我们设置了对age字段不序列化,所以它不会出现在转换出来的字符串中,设定了每个字段的顺序,从先到后为 firstName,lastName,dateOfBirth,我们现在得到的输出为

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

创建JSONObjects对象

在FastJson中,有着两个重要的对象类,一个是JSONObject,另一个是JSONArray,这两个分别对应着json中的对象和列表,底层实现分别是map和list

我们可以看一下这两个对象是怎么进行构造的

public void whenGenerateJson_thanGenerationCorrect() throws ParseException {
    JSONArray jsonArray = new JSONArray();
    for (int i = 0; i < 2; i++) {
        JSONObject jsonObject = 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();
}

在这里我们创建了一个JSONArray,并在其中添加了两个JSONObject对象,这两个对象是通过put()方法添加字段的,注意,因为JSOBObject的底层数据结构是map,所以我们可以用put和get方法来存取数据,但是不支持用索引随机访问,并且JSOBObject的键规定是String类型,值则无特定要求.

我们得到的字符串如下

[
   {
      "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对象

我们现在知道了怎么将一个Java对象转为JSON字符串,也知道怎么样去创建一个JSON字符串,是时候来看看怎么样将JSON字符串转为Java对象了.

最简单的是,如果我们有一个已经创建好的Java对象,那么我们可以直接调用JSON的parseObject方法

Person person = new Person(20, "John", "Doe", new Date());
String jsonObject = JSON.toJSONString(person);
Person newPerson = JSON.parseObject(jsonObject, Person.class);

需要注意的是,我们在使用parseObject方法的时候,需要传入一个class对象,来指定要映射的对象

如果我们没有预先定义一个对象,那么我们可以只传入字符串,用JSONObject对象来接收它

JSONObject object = JSON.parseObject(jsonOutput);

正如之前说过的,JSONObject的底层实现是map,所以我们可以用get方法传入字段名来获取属性,FastJSON为我们预先定义了多种get的方法

        Integer i = object.getInteger("AGE");
        String s = object.getString("FULL NAME");
        JSONObject jo = object.getJSONObject("sth");
        JSONArray ja = object.getJSONArray("sth2");

如果我们取得是基本类型,比如int的话,只需要在对应包装类方法后加Value就可以了,比如object.getInteger方法返回的是Integer,而object.getIntegerValue返回的是int类型

你可能感兴趣的:(JSON,JSON,Java,FastJSON)