2022-12-28 21:54:22 +08:00
|
|
|
|
# 使用Mixin注入Annotation定制序列化和反序列化
|
2022-05-21 17:28:21 +08:00
|
|
|
|
|
|
|
|
|
|
当你需要定制化序列化一些LIB里面的类,你无法修改这些类的代码,你可以使用FASTJSON2的Minxin功能注入Annotation。
|
|
|
|
|
|
|
|
|
|
|
|
比如:
|
|
|
|
|
|
|
|
|
|
|
|
## 1. 要序列化的类
|
|
|
|
|
|
```java
|
|
|
|
|
|
public static class Product {
|
|
|
|
|
|
public String name;
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 2. 注入配置类
|
|
|
|
|
|
```java
|
|
|
|
|
|
public abstract class ProductMixin {
|
|
|
|
|
|
@JSONField(name = "productName")
|
|
|
|
|
|
String name;
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 3. 注入配置 & 使用
|
|
|
|
|
|
```java
|
|
|
|
|
|
// 配置注入
|
|
|
|
|
|
JSON.mixIn(Product.class, ProductMixin.class);
|
|
|
|
|
|
|
|
|
|
|
|
// 使用
|
|
|
|
|
|
Product product = new Product();
|
|
|
|
|
|
product.name = "DataWorks";
|
|
|
|
|
|
assertEquals("{\"productName\":\"DataWorks\"}", JSON.toJSONString(product));
|
|
|
|
|
|
|
|
|
|
|
|
Product productParsed = JSON.parseObject("{\"productName\":\"DataWorks\"}", Product.class);
|
|
|
|
|
|
assertEquals("DataWorks", productParsed.name);
|
|
|
|
|
|
```
|
2022-06-05 14:28:34 +08:00
|
|
|
|
|
|
|
|
|
|
## 4. 结合JSONCreator & JSONField(value=true)的例子
|
|
|
|
|
|
如下的Address类,没有缺省构造函数,只有一个字段,我希望序列化结果为address字段的字符串。
|
|
|
|
|
|
```java
|
|
|
|
|
|
public static class Address {
|
|
|
|
|
|
private final String address;
|
|
|
|
|
|
|
|
|
|
|
|
public Address(String address) {
|
|
|
|
|
|
this.address = address;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public String getAddress() {
|
|
|
|
|
|
return address;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
注入使用方式如下:
|
|
|
|
|
|
```java
|
|
|
|
|
|
static class AddressMixin {
|
|
|
|
|
|
// 通过JSONCreator指定构造函数
|
|
|
|
|
|
@JSONCreator
|
|
|
|
|
|
public AddressMixin(@JSONField(value = true) String address) {
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 配置输出使用此字段
|
|
|
|
|
|
@JSONField(value = true)
|
|
|
|
|
|
public String getAddress() {
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
|
public void test() {
|
|
|
|
|
|
JSON.mixIn(Address.class, AddressMixin.class); // 通过mixin注入Annotation
|
|
|
|
|
|
|
|
|
|
|
|
Address address = new Address("HangZhou");
|
|
|
|
|
|
|
|
|
|
|
|
// 序列化输出结果为address字段
|
|
|
|
|
|
String str = JSON.toJSONString(address);
|
|
|
|
|
|
assertEquals("\"HangZhou\"", str);
|
|
|
|
|
|
|
|
|
|
|
|
// 通过结果可以看出使用了JSONCreator指定的构造函数
|
|
|
|
|
|
Address address1 = JSON.parseObject(str, Address.class);
|
|
|
|
|
|
assertEquals(address.getAddress(), address1.getAddress());
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|