jackson序列化的时候增加额外的字段

package com.json;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;

import java.io.IOException;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.util.Date;

public class AddFieldJsonSerializer extends JsonSerializer<Long> /*implements ContextualSerializer*/ {

    @Override
    public void serialize(Long utc,
                          JsonGenerator gen,
                          SerializerProvider serializerProvider) throws IOException {

        // 获取序列化对象
        Object currentValue = gen.getCurrentValue();

        // 序列化字段名称
        String fieldName = gen.getOutputContext().getCurrentName();

        // 获取注解的值
        try {
            Field field = currentValue.getClass().getDeclaredField(fieldName);
            TestAnno annotation = field.getAnnotation(TestAnno.class);
            System.out.println(annotation.value());
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

        // 写原始字段的值
        gen.writeString(String.valueOf(utc));

        // 新增字段
        gen.writeFieldName("add");
        gen.writeString("小明");
    }


    public static void main(String[] args) throws JsonProcessingException {
//        GlobalUtils.setZone("Asia/Phnom_Penh");

        ObjectMapper objectMapper = new ObjectMapper();
        Person user = new Person("zhangsan", System.currentTimeMillis());
        // class to json
        String userStr = objectMapper.writeValueAsString(user);
        // json to class
        System.out.println(userStr);
    }

//    @Override
//    public JsonSerializer<?> createContextual(SerializerProvider provider, BeanProperty property) throws JsonMappingException {
//        SerializationConfig config = provider.getConfig();
//        JsonFormat.Value defaultPropertyFormat = config.getDefaultPropertyFormat(UtcJsonSerializer.class);
//
//        return this;
//    }
}

@Data
class Person{
    private String name;
    @JsonSerialize(using = AddFieldJsonSerializer.class, nullsUsing = AddFieldJsonSerializer.class)
    @TestAnno("asdf")
    private Long bithUtc;

    public Person(String name, Long bithUtc) {
        this.name = name;
        this.bithUtc = bithUtc;
    }

    public Person() {
    }

    @JsonProperty("age")
    public String getAge(){
        return "asdfk";
    }
}

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@interface TestAnno {

    String value() default "";
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容