@JSONField
該注解隸屬於阿里fastjson,方便fastjson處理對象時的一些操作
源碼
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
public @interface JSONField {
/**
* config encode/decode ordinal
* @since 1.1.42
* @return
*/
int ordinal() default 0;
String name() default "";
String format() default "";
boolean serialize() default true;
boolean deserialize() default true;
SerializerFeature[] serialzeFeatures() default {};
Feature[] parseFeatures() default {};
String label() default "";
/**
* @since 1.2.12
*/
boolean jsonDirect() default false;
/**
* Serializer class to use for serializing associated value.
*
* @since 1.2.16
*/
Class<?> serializeUsing() default Void.class;
/**
* Deserializer class to use for deserializing associated value.
*
* @since 1.2.16
*/
Class<?> deserializeUsing() default Void.class;
/**
* @since 1.2.21
* @return the alternative names of the field when it is deserialized
*/
String[] alternateNames() default {};
/**
* @since 1.2.31
*/
boolean unwrapped() default false;
}
- ordinal() 順序設置。
缺省fastjson序列化一個java bean,是根據fieldName的字母序進行序列化的,你可以通過ordinal指定字段的順序。這個特性需要1.1.42以上版本
- name() 指定名字。指定后,序列化后字段名變為指定名稱,反序列化同理;
- format() 指定日期格式;
- serialize() deserialize() 是否序列化和反序列化,默認true。
- serialzeFeatures() 序列化特性選擇,具體參考后面文章吧;通過枚舉選擇
- parseFeatures() 解釋特性選擇;通過枚舉選擇
- label() 打標記,可定制化輸出
@JSONField(label = "normal")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@JSONField(label = "normal")
public String getName() {
return name;
}
System.out.println(JSON.toJSONString(v, Labels.includes("normal")));
- jsonDirect() 直接輸出而不經過json轉譯
在fastjson-1.2.12版本中,JSONField支持一個新的配置項jsonDirect,它的用途是:當你有一個字段是字符串類型,里面是json格式數據,你希望直接輸入,而不是經過轉義之后再輸出。
- serializeUsing() deserializeUsing() 指定序列化、反序列化使用自定義Serialize、Parser(注意,直接寫在類中即可,格式固定,關鍵是取值)
//示例1
public static class TimeStampDeserializer implements ObjectDeserializer {
@Override
public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
String time = parser.getLexer().stringVal();
if (StringUtils.isBlank(time)) {
return (T)String.valueOf(new Date().getTime());
} else {
return (T)(time + "000");
}
}
@Override
public int getFastMatchToken() {
return 0;
}
}
//示例2
public static class Model {
@JSONField(serializeUsing = ModelValueSerializer.class)
public int value;
}
public static class ModelValueSerializer implements ObjectSerializer {
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
int features) throws IOException {
Integer value = (Integer) object;
String text = value + "元";
serializer.write(text);
}
}
- alternateNames() 多名字。允許多個名字的變量轉成一個
@JSONField(alternateNames = {"user", "person"})
public String name;
- unwrapped() 不封箱
搭配JSON.parseObject
給輸出結構體中field配置上@JSONField(name="aaa")等,直接轉出得到的json串
Response response = JSON.parseObject(res, Response.class);
@Setter
@Getter
@NoArgsConstructor
@ToString
public class Response {
@JSONField(name = "answerList")
private List<Answer> answers;
@JSONField(name = "timeStamp")
private String timeStamp;
@JSONField(name = "type")
private String answerType;
@JSONField(name = "id")
private String erp;
@JSONField(name = "session")
private String sessionId;
@JSONField(name = "topic")
private String topic;
@JSONField(deserialize = false, serialize = false)
private String answerType = AnswerTypeEnum.ANSWER.getCode();
}