-
Notifications
You must be signed in to change notification settings - Fork 6.5k
MixInAnnotations_en
1.2.60 added support for MixInAnnotations, with four brand new static APIs introduced in JSON.class
. This feature is still under beta condition, feel free to have them tested. MixInAnnotations support configuring a MixIn class for a certain Target class and switching between different Target-MixIn combinations.
package com.alibaba.fastjson;
public abstract class JSON {
// Associate Target class and MixIn class
public static void addMixInAnnotations(Type target, Type mixIn)
// Remove the association
public static void removeMixInAnnotations(Type target)
// Clear all associations
public static void clearMixInAnnotations()
// Get associated MixIn class for a given Target class
public static Type getMixInAnnotations(Type target)
}
Assuming we have a Rectangle.class
that comes from a third-party library, whose definition is as followed:
public final class Rectangle {
final private int w, h;
public Rectangle(int w, int h) {
this.w = w;
this.h = h;
}
public int getW() { return w; }
public int getH() { return h; }
public int getSize() { return w * h; }
}
This class might not serialize or deserialize in the way we expected, since:
- "w" and "h" seems hard to understand, better replaced by "width" and "height"
- getSize() may result in containing a non-exist field "size" in the output of serialization
- you can't add annotations directly to third-party classes in most cases
Introducing MixInAnnotations:
Define a MixIn class:
abstract class MixIn {
@JSONField(name="width") abstract int getW(); // rename field
@JSONField(name="height") abstract int getH(); // rename field
@JSONField(serialize=false) abstract int getSize(); // go away, please
}
Use the APIs:
// Associate Target class and MixIn class
JSON.addMixInAnnotations(Rectangle.class, MixIn.class);
// Serialization
Rectangle rectangle = new Rectangle(5, 10);
String str = JSON.toJSONString(rectangle);
System.out.println(str); // {"width":5, "height":10}
// Deserialization
Rectangle rectangle2 = JSON.parseObject(str, Rectangle.class);
System.out.println(rectangle2.getW()); // 5
System.out.println(rectangle2.getH()); // 10
// Remove association
JSON.removeMixInAnnotations(Rectangle.class);
In addition, fastjson's MixInAnnotations supports switching between different MixIn classes:
abstract class MixIn_CN {
@JSONField(name="长度") abstract int getW();
@JSONField(name="宽度") abstract int getH();
@JSONField(serialize=false) abstract int getSize();
}
Use case:
// Associate Target class and MixIn class
JSON.addMixInAnnotations(Rectangle.class, MixIn.class);
// Serialization
Rectangle rectangle = new Rectangle(5, 10);
String str = JSON.toJSONString(rectangle);
System.out.println(str); // {"width":5, "height":10}
// Associate Target class and MixIn_CN class
JSON.addMixInAnnotations(Rectangle.class, MixIn_CN.class);
// Serialization
str = JSON.toJSONString(rectangle);
System.out.println(str); // {"宽度":5, "长度":10}
// Remove association
JSON.removeMixInAnnotations(Rectangle.class);
// Serialization
str = JSON.toJSONString(rectangle);
System.out.println(str); // {"h":10,"size":50,"w":5}
- MixInAnnotations support all annotation sets that fastjson recognizes, with the same usage migrates from Target class to MixIn class.
- A target class associates with the most recently associated MixIn class.
- Annotations for constructors from target class can directly be put on constructors with the same parameter types in MixIn class(even though they have different names)
- Make sure associated fields and methods(excepts constructors) in MixIn class have the same name and signature as those in Target class.
- MixInAnnotations work as expected within inheritance hierarchy.(For example, you can associate MixIn class to super-classes. In this case, the annotations will be overridden by annotations from sub-classes)
- It's not suggested to switch MixIn configuration for a single Target class under multi-threading environment.
如有需要修改本注脚,请联系阿里巴巴,
© Alibaba Fastjson Develop Team
注明: 版权所有阿里巴巴,请注明版权所有者
If you need to amend this footnote, please contact Alibaba.
© Alibaba Fastjson Develop Team
Note: Copyright Alibaba, please indicate the copyright owner