java - jackson :根据字段类型添加后缀

标签 java serialization jackson jackson2 jackson-modules

这是我的 POJO:

public class AutorDenormalized {

    private String id;
    private Long unitatId;
    private String grupId;
    private String descripcio;

    public AutorDenormalized() {

    }

    // getters $ setters

}

我想序列化这类对象,根据字段类型添加后缀。我的意思是,

  • 如果字段类型是字符串 -> 然后添加一个 *_s 后缀
  • 如果字段类型是 Long -> 然后添加一个 *_l 后缀
  • 否则继续

你有什么解决办法吗?

最佳答案

您需要实现自定义 BeanPropertyWriter,它可以生成带有后缀的属性名称。要注册自定义 BeanPropertyWriter,您需要创建自定义 BeanSerializerModifier

下面的示例显示了简化的实现,它显示了如何实现上述结果的方法:

import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
import com.fasterxml.jackson.databind.util.NameTransformer;

import java.io.IOException;
import java.util.List;

public class JsonTypeInfoApp {

    public static void main(String[] args) throws IOException {
        SimpleModule typeSuffixModule = new SimpleModule();
        typeSuffixModule.setSerializerModifier(new TypeSuffixBeanSerializerModifier());

        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.registerModule(typeSuffixModule);

        System.out.println(mapper.writeValueAsString(new AutorDenormalized()));
    }
}

class TypeSuffixBeanSerializerModifier extends BeanSerializerModifier {

    @Override
    public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {
        for (int i = 0; i < beanProperties.size(); ++i) {
            final BeanPropertyWriter writer = beanProperties.get(i);
            Class<?> rawType = writer.getType().getRawClass();
            if (supports(rawType)) {
                final String suffix = constructSuffix(rawType);

                beanProperties.set(i, writer.rename(NameTransformer.simpleTransformer(null, suffix)));
            }
        }
        return beanProperties;
    }

    private String constructSuffix(Class<?> rawType) {
        return "_" + Character.toLowerCase(rawType.getSimpleName().charAt(0));
    }

    private boolean supports(Class<?> rawClass) {
        return rawClass == String.class || rawClass == Long.class;
    }
}

以上代码打印:

{
  "id_s" : "1",
  "unitatId_l" : 123,
  "grupId_s" : "2",
  "descripcio_s" : "3"
}

另见:

关于java - jackson :根据字段类型添加后缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64909759/

相关文章:

JavaCV透视校正

java - 在 Tomcat 上的 GWT 中加载属性文件

php - 需要从数据库字段反序列化数据,以替换为纯文本

C# BinaryFormatter - 使用另一个命名空间中的对象反序列化

java - 将 JSON 反序列化为 Java 对象时,如何将父属性映射到子对象?

java - 使用 jsonrpc4j 记录 JSON-RPC 调用

java - 当我切换到另一个包含回收器 View 的 Activity 时,应用程序崩溃

java - Hibernate JPA 与共享主键的一对一映射导致了该问题

c# - 接口(interface)中的静态

java - REST Jackson JsonDeserialize,升级后出现 StackOverflowError