【技術累積】【點】【java】【27】@JSONField

@JSONField

該註解隸屬於阿里fastjson,方便fastjson處理對象時的一些操做html

源碼java

@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() 順序設置。git

    缺省fastjson序列化一個java bean,是根據fieldName的字母序進行序列化的,你能夠經過ordinal指定字段的順序。這個特性須要1.1.42以上版本github

  • name() 指定名字。指定後,序列化後字段名變爲指定名稱,反序列化同理;
  • format() 指定日期格式;
  • serialize() deserialize() 是否序列化和反序列化,默認true。
  • serialzeFeatures() 序列化特性選擇,具體參考後面文章吧;經過枚舉選擇
  • parseFeatures() 解釋特性選擇;經過枚舉選擇
  • label() 打標記,可定製化輸出json

@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轉譯session

    在fastjson-1.2.12版本中,JSONField支持一個新的配置項jsonDirect,它的用途是:當你有一個字段是字符串類型,裏面是json格式數據,你但願直接輸入,而不是通過轉義以後再輸出。app

  • serializeUsing() deserializeUsing() 指定序列化、反序列化使用自定義Serialize、Parser(注意,直接寫在類中便可,格式固定,關鍵是取值)ide

//示例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串this

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();
}

參考文章

相關文章
相關標籤/搜索