首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jackson:根据字段类型添加后缀

Jackson:根据字段类型添加后缀
EN

Stack Overflow用户
提问于 2020-11-19 10:27:34
回答 2查看 295关注 0票数 3

我的POJO

代码语言:javascript
运行
复制
public class AutorDenormalized {

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

    public AutorDenormalized() {

    }

    // getters $ setters

}

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

如果字段类型为字符串suffix

  • Otherwise,则添加*_s后缀

  • ,如果字段类型为长->,则添加*_l

你有什么办法解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-19 21:14:29

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

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

代码语言:javascript
运行
复制
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;
    }
}

以上代码打印:

代码语言:javascript
运行
复制
{
  "id_s" : "1",
  "unitatId_l" : 123,
  "grupId_s" : "2",
  "descripcio_s" : "3"
}

另请参阅:

票数 2
EN

Stack Overflow用户

发布于 2020-12-10 22:45:26

除了可以接受的答案外,您还可以考虑实现PropertyNameStrategy:它将允许您重命名属性并获取字段、setter/getter、创建者参数(您需要找到属性的类型)。工作可能会少一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64909759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档