首先引入依赖 一个是FastJson 一个是lombok 辅助用的
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
1. @JSONField的使用
首先来看一个示例
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
@JSONField(name = "Name",ordinal = 2)
private String name;
@JSONField(name = "描述",ordinal = 1)
private String desc;
@JSONField(format = "yyyy-MM-dd")
private Date date;
@JSONField(serialize = false)
private int age;
}
测试方法 测试一下这些属性对应的含义
public class Mytest {
public static void main(String[] args) {
Person person = new Person("baobao", "hello bb", new Date(), 18);
// 将对象转化为json格式字符串 并打印
System.out.println(JSON.toJSONString(person));
}
}
输出如下
{"date":"2021-06-22","描述":"hello bb","Name":"baobao"}
对此我们可以得出一些结论:
name
指定json格式的key的别名是什么
可以看到 我们指定desc的name = "描述"
得到的key-value为"描述":"hello bb"
serialize
指定该字段是否进行序列化 如果不序列化 则不会在结果中显示出来,如serialize=false
而age属性我们明明设置了 但没有显示出来format
参数用于格式化 date 属性,如format="yyyy-MM-dd"
可以看到显示的日期为"date":"2021-06-22"
ordinal
指明字段显示的顺序 ⚠️注意默认值为0哦,因为我们没有设置date的值,但是它是第一个现实的
@JSONField 的作用对象:
- Field
- Setter 和 Getter 方法
⚠️注意:
1.FastJson 在进行操作时,是根据 getter 和 setter 的方法进行的,并不是依据 Field 进行。
2.若属性是私有的,必须有 set 方法。否则无法反序列化,如果Field与Getter同时设置,则以Getter为准,因为我们取属性的值都是由Getter方法来取的,这点需要注意。
2. 创建JSON对象
public class JsonDemo {
public static void main(String[] args) {
JSONArray jsonArray = new JSONArray();
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "bb");
jsonObject.put("age", "18");
System.out.println(jsonObject.toJSONString());
JSONObject jsonObject2 = new JSONObject();
jsonObject2.put("name", "cc");
jsonObject2.put("age", "20");
System.out.println(jsonObject2.toJSONString());
// 创建json对象 要放入JsonArray中
jsonArray.add(jsonObject);
jsonArray.add(jsonObject2);
String jsonString = jsonArray.toJSONString();
System.out.println(jsonString);
}
}
结果输出
{"name":"bb","age":"18"}
{"name":"cc","age":"20"}
[{"name":"bb","age":"18"},{"name":"cc","age":"20"}]
说白了 单个JSON对象 直接使用JSONObject
而如果JSON格式中包含多个属性 则需要使用JSONArray
3. JSON 字符串转换为 Java 对象
示例如下
public class JsonDemo {
public static void main(String[] args) {
String json = "{\"name\":\"cc\",\"age\":\"20\"}";
User user = JSON.parseObject(json, User.class);
System.out.println(user);
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class User {
private String name;
private int age;
}
结果输出:
User(name=cc, age=20)
⚠️注意:
反序列化为对象时 必须要有无参构造!!!!!!!!!
反序列化为对象时 必须要有无参构造!!!!!!!!!
反序列化为对象时 必须要有无参构造!!!!!!!!!
最后再说一点 JsonField对于时间格式化效果不是那么的好 推荐使用@JsonFormat
可以将实体类的时间格式转化成如下格式 且可以设置时区 一般都要设置 否则时间会出现错误
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")