All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.anonymousmister.bootfastconfig.jackson.BaseSimpleAnnotationJson Maven / Gradle / Ivy

package com.github.anonymousmister.bootfastconfig.jackson;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonStreamContext;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.deser.BeanDeserializerBuilder;
import com.fasterxml.jackson.databind.deser.SettableBeanProperty;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.github.anonymousmister.bootfastconfig.expand.AnnotationJson;

import java.io.IOException;
import java.lang.annotation.Annotation;
import java.util.List;

/**
 * @author misterzhang
 */
public abstract class BaseSimpleAnnotationJson implements AnnotationJson {


    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public void updateBuilder(DeserializationConfig config,
                              BeanDescription beanDesc,
                              BeanDeserializerBuilder builder,
                              SettableBeanProperty settableBeanProperty, T annotation) {


        SettableBeanProperty newSettableBeanProperty = settableBeanProperty.withValueDeserializer(

                new JsonDeserializer() {
                    @Override
                    public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
                        return deserializ(p, settableBeanProperty, annotation);
                    }
                });
        builder.addOrReplaceProperty(newSettableBeanProperty, true);

    }


    public Object deserializ(JsonParser p, SettableBeanProperty settableBeanProperty, T annotation) throws IOException {
        Class rawClass = settableBeanProperty.getType().getRawClass();
        Object o = objectMapper.readValue(p, rawClass);
        if (o instanceof String) {
            String a = ((String) o);
            while (a.startsWith("\"")) {
                a = a.substring(1, a.length()).trim();
            }
            while (a.endsWith("\"")) {
                a = a.substring(0, a.length() - 1).trim();
            }
            o = a;
        }
        JsonStreamContext parsingContext = p.getParsingContext();

        return deserialize(parsingContext != null ? parsingContext.getCurrentValue() : null, parsingContext != null ? parsingContext.getCurrentName() : null, o, annotation);
    }

    ;

    /**
     * 反序列化
     *
     * @param object
     * @param name
     * @param value
     * @param annotation
     * @return
     */
    public abstract Object deserialize(Object object, String name, Object value, T annotation) throws JsonProcessingException;


    /**
     * 序列化
     *
     * @param object
     * @param name
     * @param value
     * @param annotation
     * @return
     * @throws JsonProcessingException
     */
    @Override
    public abstract Object serialization(Object object, String name, Object value, T annotation);

    public String serialization(JsonGenerator jsonGenerator, Object o, T annotation) throws JsonProcessingException {

        JsonStreamContext outputContext = jsonGenerator.getOutputContext();

        Object serialization = serialization(outputContext != null ? outputContext.getCurrentValue() : null, outputContext != null ? outputContext.getCurrentName() : null, o, annotation);
        if (serialization instanceof String) {
            return (String) serialization;
        }
        return serialization == null ? null : objectMapper.writeValueAsString(serialization);

    }

    ;

    @Override
    public void changeProperties(SerializationConfig config,
                                 BeanDescription beanDesc,
                                 List beanProperties,
                                 BeanPropertyWriter writer, T annotation) {
        writer.assignSerializer(new JsonSerializer() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString(serialization(jsonGenerator, o, annotation));

            }
        });
    }


}