当前位置: 首页 > 面试题库 >

Jackson-自定义序列化程序,仅覆盖特定字段

杜弘伟
2023-03-14
问题内容

我知道如何在Jackson中使用自定义序列化程序(通过扩展JsonSerializer),但是我希望默认序列化程序可用于除1个字段之外的所有字段,我想使用自定义序列化程序覆盖该字段。

注释不是一种选择,因为我正在序列化一个生成的类(来自Thrift)。

编写自定义杰克逊序列化程序时,如何仅指定要覆盖的某些字段?

更新:

这是我要序列化的类:

class Student {
    int age;
    String firstName;
    String lastName;
    double average;
    int numSubjects

    // .. more such properties ...
}

上面的类有很多特质,其中大多数使用本机类型。我只想覆盖自定义序列化程序中的一些属性,然后让Jackson照常处理其余的属性。例如,我只想将“
age”字段转换为自定义输出。


问题答案:

我遇到了同样的问题,并使用CustomSerializerFactory解决了这个问题。

这种方法使您可以忽略所有对象或特定类型的某些特定字段。

public class EntityCustomSerializationFactory extends CustomSerializerFactory {

    //ignored fields
    private static final Set<String> IGNORED_FIELDS = new HashSet<String>(
            Arrays.asList(
                    "class",
                    "value",
                    "some"
            )
    );


    public EntityCustomSerializationFactory() {
        super();
    }

    public EntityCustomSerializationFactory(Config config) {
        super(config);
    }

    @Override
    protected void processViews(SerializationConfig config, BeanSerializerBuilder builder) {
        super.processViews(config, builder);

        //ignore fields only for concrete class
        //note, that you can avoid or change this check
        if (builder.getBeanDescription().getBeanClass().equals(Entity.class)){
            //get original writer
            List<BeanPropertyWriter> originalWriters = builder.getProperties();

            //create actual writers
            List<BeanPropertyWriter> writers = new ArrayList<BeanPropertyWriter>();

            for (BeanPropertyWriter writer: originalWriters){
                String propName = writer.getName();

                //if it isn't ignored field, add to actual writers list
                if (!IGNORED_FIELDS.contains(propName)){
                    writers.add(writer);
                }
            }

            builder.setProperties(writers);
        }

    }
}

然后,您可以使用如下所示的内容:

objectMapper.setSerializerFactory(new EntityCustomSerializationFactory());
objectMapper.writeValueAsString(new Entity());//response will be without ignored fields


 类似资料:
  • 我有这样的Jackson注释类: 假设我不能更改我的类代码。那么,如何让ObjectMapper只覆盖field2的JsonIgnore并将其序列化为json?但我希望它忽略field4。这很简单,只需要几行代码吗? 我的常规序列化代码:

  • 有没有一种方法可以使用Jackson JSON处理器来执行自定义字段级别的序列化?例如,我想让 注意,age=25被编码为数字,而favoritenumber=123被编码为字符串。Jackson将编组为一个数字。在这种情况下,我希望将favoriteNumber编码为字符串。

  • 情况如下:我已经设法让Jackson反序列化以下通用 作为HTTP客户端,并使用exchange

  • 下面的代码再现了这个问题: 上面的代码不做其他注册“自定义”序列化程序的事情(只是委托回原始序列化程序),但它生成的JSON没有null属性: {“第一个”:“鲍勃”,“最后一个”:“巴克”} 我读过许多看似相关的SO文章,但没有一篇能让我找到解决方案。我尝试在序列化时显式地将映射器设置为,但没有成功。 我唯一的线索是JavaDoc for JsonSerializer中的一条注释: 注意:永远不

  • 我试图创建会影响序列化值的自定义jackson注释。 意思是: 现在序列化对象X(10)将导致: 我怎样才能做到这一点?

  • 问题内容: 有没有一种使用Jackson JSON Processor进行自定义字段级序列化的方法?例如,我想上课 序列化为以下JSON: 请注意,age = 25被编码为 数字, 而favoriteNumber = 123被编码为 string 。开箱即用的杰克逊将集结到一个号码。在这种情况下,我希望将favoriteNumber编码为字符串。 问题答案: 您可以实现自定义序列化器,如下所示: