When you need to customize the serialization of classes from a library whose code you cannot modify, you can use FASTJSON2's Mixin feature to inject annotations.
For example:
public static class Product {
public String name;
}public abstract class ProductMixin {
@JSONField(name = "productName")
String name;
}// Configure injection
JSON.mixIn(Product.class, ProductMixin.class);
// Usage
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);Consider the following Address class, which has no default constructor and only one field. We want the serialization result to be the string value of the address field.
public static class Address {
private final String address;
public Address(String address) {
this.address = address;
}
public String getAddress() {
return address;
}
}The injection and usage are as follows:
static class AddressMixin {
// Specify the constructor with @JSONCreator
@JSONCreator
public AddressMixin(@JSONField(value = true) String address) {
}
// Configure the output to use this field
@JSONField(value = true)
public String getAddress() {
return null;
}
}
@Test
public void test() {
JSON.mixIn(Address.class, AddressMixin.class); // Inject annotations via mixin
Address address = new Address("HangZhou");
// The serialization output is the value of the address field
String str = JSON.toJSONString(address);
assertEquals("\"HangZhou\"", str);
// The result shows that the constructor specified by @JSONCreator was used
Address address1 = JSON.parseObject(str, Address.class);
assertEquals(address.getAddress(), address1.getAddress());
}