【问题标题】:Jackson - Custom serializer for propeties inside objectJackson - 对象内部属性的自定义序列化程序
【发布时间】:2016-06-20 08:38:42
【问题描述】:

我正在寻找一种使用 Jackson 将所有 BigIntegers 输出为字符串的方法。这些 BigIntegers 在我的应用程序中的许多类中使用,因此不能将@JsonSerialize 添加到所有字段。

我创建了一个自定义 Jackson 序列化程序,但这仅适用于基类,被序列化,而不是类内的属性。所以,这不起作用:

public class BigIntegerSerializer extends JsonSerializer<BigInteger> {

    @Override
    public void serialize(BigInteger value, JsonGenerator jgen,
                      SerializerProvider provider) throws IOException {
        jgen.writeString(value + "");
    }
}

有没有办法让 Jackson 对某种​​类型的所有属性进行序列化,而不向所有属性添加 @JsonSerialize?

要序列化的对象可以是任何包含BigIntegers的POJO。

PS:将 BigIntegers 转换为 String 的想法是 JavaScript 不会将这些数字转换为科学计数法。我所有的主键都使用 BigInteger,所以当 JavaScript 将它们转换为科学计数法时,我不能再使用它们了。

【问题讨论】:

  • 也许可以试试Module?请注意,这是针对 2.7 的;有关旧版本的 javadoc,请参阅 here
  • 我已经在使用一个模块,但是没有用 :( 嵌套属性不使用序列化器是正常的吗?

标签: java serialization jackson


【解决方案1】:

看看this guide。例如

ObjectMapper mapper = new ObjectMapper();
SimpleModule testModule = new SimpleModule("MyModule", new Version(1, 0, 0, null));
testModule.addSerializer(new BigIntegerSerializer());
mapper.registerModule(testModule);

【讨论】:

  • 这正是我所做的,但它不处理我想要序列化的类中的 BigInteger 属性。或者,是否有其他东西(Spring boot)打破了这一点?
  • 尝试使用接受类型的 addSerializer 方法:testModule.addSerializer(BigInteger.class, new BigIntegerSerializer());。使用您用于序列化对象的源代码更新您的问题也会很有帮助,以便我们查看是否有任何错误。
  • 我刚刚发现程序的其他地方有一个对我隐藏的异常。看起来你所有的代码都很完美。谢谢你的例子。
猜你喜欢
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 2021-08-22
相关资源
最近更新 更多