Fastjson2RenderFactoryBase.java

package com.alibaba.fastjson2.support.solon;

import com.alibaba.fastjson2.writer.ObjectWriter;
import com.alibaba.fastjson2.writer.ObjectWriterProvider;
import org.noear.solon.core.convert.Converter;
import org.noear.solon.serialization.JsonRenderFactory;

/**
 * Json RenderFactory Base
 *
 * @author noear
 * @author ������������
 * @since 1.10
 * @since 2024-10-01
 */
public abstract class Fastjson2RenderFactoryBase
        implements JsonRenderFactory {
    protected Fastjson2StringSerializer serializer = new Fastjson2StringSerializer();

    public Fastjson2RenderFactoryBase() {
        //The default time handling is a timestamp
        serializer.getSerializeConfig().setDateFormat("millis");
    }

    /**
     * Gets the serializer
     */
    public Fastjson2StringSerializer getSerializer() {
        return serializer;
    }

    /**
     * Serialize the configuration
     */
    public ObjectWriterProvider config() {
        return serializer.getSerializeConfig().getProvider();
    }

    /**
     * Adding the encoder
     *
     * @param clz type
     * @param encoder encoder
     */
    public <T> void addEncoder(Class<T> clz, ObjectWriter encoder) {
        config().register(clz, encoder);
    }

    /**
     * Add converter (simplified version of encoder)
     *
     * @param clz type
     * @param converter converter
     */
    @Override
    public <T> void addConvertor(Class<T> clz, Converter<T, Object> converter) {
        addEncoder(clz, (out, obj, fieldName, fieldType, features) -> {
            Object val = converter.convert((T) obj);
            if (val == null) {
                out.writeNull();
            } else if (val instanceof String) {
                out.writeString((String) val);
            } else if (val instanceof Number) {
                if (val instanceof Long) {
                    out.writeInt64(((Number) val).longValue());
                } else if (val instanceof Integer) {
                    out.writeInt32(((Number) val).intValue());
                } else if (val instanceof Float) {
                    out.writeDouble(((Number) val).floatValue());
                } else {
                    out.writeDouble(((Number) val).doubleValue());
                }
            } else {
                throw new IllegalArgumentException("The result type of the converter is not supported: " + val.getClass().getName());
            }
        });
    }
}