gpt4 book ai didi

java - Jackson序列化忽略迭代器类的 '@JsonTypeInfo'和 '@JsonIgnore'?

转载 作者:太空宇宙 更新时间:2023-11-04 09:02:04 25 4
gpt4 key购买 nike

我最近从 Jackson 2.9.10 升级到 2.10.0,并注意到迭代器类的序列化方式发生了变化。

根据下面的测试,2.9.10 的输出(处理 JsonTypeInfo 和 JsonIgnore)为

{"@class":"IteratorTest"}

但是在2.10.0中,JsontTypeInfo和JsonIgnore不会被处理,并且输出是

["IteratorTest",["一","二"]]

新的序列化行为正确吗?是否有解决方法可以恢复旧行为?

// Test class
import java.util.Iterator;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "@class", visible=true)
public class IteratorTest<T> implements Iterator<T> {
@JsonIgnore
private Iterator<T> iterData;
private static final ObjectMapper MAPPER = new ObjectMapper();
IteratorTest(Iterator<T> iterData) { this.iterData = iterData; }

@Override
public boolean hasNext() {
return iterData.hasNext();
}
@Override
public T next() {
return iterData.next();
}

public static void main(String[] args) throws IOException {
List<String> strings = new ArrayList<>();
strings.add("one");
strings.add("two");

IteratorTest<String> it = new IteratorTest<>(strings.iterator());

System.out.println("-- serializing --");
String s = MAPPER.writeValueAsString(it);
System.out.println(s);
}
}
// end of Test class

最佳答案

是的,调试它,在版本 2.9.10 中你会得到一个 BeanSerializer,在版本 2.10.0 中你会得到一个 IteratorSerializer

在版本 2.10.0 中,当您的类没有任何属性 (BeanSerializerFactory.findSerializerByAddonType) 时,您将获得 IteratorSerializer。在版本 2.9.10 中,您可以从 builder.createDummy() 获取 BeanSerializer

修复:

  • 使用自定义序列化器
  • 也许可以更改 OM 的迭代器类的处理方式
  • 使用现有属性,s.t.创建一个 BeanSerializer(这会给你一个不同的 json):

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "myClass")
    class IteratorTest<T> implements Iterator<T> {

    private String myClass = IteratorTest.class.getSimpleName();

    ...
    }

关于java - Jackson序列化忽略迭代器类的 '@JsonTypeInfo'和 '@JsonIgnore'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60698714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com