Jackson Serializer 调用了错误的类型
Jackson Serializer called on wrong types
我正在与 Jackson 合作并编写了以下自定义序列化程序:
public class FooSerializer extends StdSerializer<List<Foo>> {
public FooSerializer() {
this(null);
}
public FooSerializer(Class<List<Foo>> t) {
super(t);
}
public void serialize(List<Foo> foos, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeStartArray(foos.size());
for(Foo foo : foos){
gen.writeString(foo.getName());
}
gen.writeEndArray();
}
}
我已经在ObjectMapper
中注册如下:
SimpleModule fooModule = new SimpleModule("Foo Module");
fooModule.addSerializer(new FooSerializer((Class<List<Foo>>)(Object)List.class));
objectMapper.registerModule(fooModule);
我希望它能接收一个包含 List
个 Foo
的对象,并且 return 它就像
{
...
"foos":["name1", "name2"]
...
}
这很好用,但是,当我传递 SomeObjectHoldingFoos
的 List
时,每个人都持有 Foo
的 List
,ObjectMapper 尝试应用FooSerializer
已经 List
,导致 Foo cannot be cast to SomeObjectHoldingFoos
异常。
我怀疑 FooSerializer
的 handledType
不知何故被设置为 List
而不是 List<Foo>
但我不知道如何解决这个问题,因为参数化类型似乎没有 class。
我能做什么?
使用 JavaType
而不是 Class
。
class FooSerializer extends StdSerializer<List<Foo>> {
FooSerializer(JavaType javaType) {
super(javaType);
}
....
}
然后像下面这样注册:
SimpleModule fooModule = new SimpleModule("Foo Module");
CollectionLikeType type = mapper.getTypeFactory().constructCollectionLikeType(ArrayList.class, Foo.class);
fooModule.addSerializer(new FooSerializer(type));
我意识到我只需要 Converter
而不是 Serializer
,我已经实现了以下内容:
public class FooConverter extends StdConverter<Foo, String> {
@Override
public String convert(Foo value) {
return value.getName();
}
public static SimpleModule getSimpleModule(){
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Foo.class, new StdDelegatingSerializer(new FooConverter()));
return simpleModule;
}
}
我注册如下:
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(TAGWrapper.class, new StdDelegatingSerializer(new TagWrapperConverter()));
objectMapper.registerModule()
我正在与 Jackson 合作并编写了以下自定义序列化程序:
public class FooSerializer extends StdSerializer<List<Foo>> {
public FooSerializer() {
this(null);
}
public FooSerializer(Class<List<Foo>> t) {
super(t);
}
public void serialize(List<Foo> foos, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeStartArray(foos.size());
for(Foo foo : foos){
gen.writeString(foo.getName());
}
gen.writeEndArray();
}
}
我已经在ObjectMapper
中注册如下:
SimpleModule fooModule = new SimpleModule("Foo Module");
fooModule.addSerializer(new FooSerializer((Class<List<Foo>>)(Object)List.class));
objectMapper.registerModule(fooModule);
我希望它能接收一个包含 List
个 Foo
的对象,并且 return 它就像
{
...
"foos":["name1", "name2"]
...
}
这很好用,但是,当我传递 SomeObjectHoldingFoos
的 List
时,每个人都持有 Foo
的 List
,ObjectMapper 尝试应用FooSerializer
已经 List
,导致 Foo cannot be cast to SomeObjectHoldingFoos
异常。
我怀疑 FooSerializer
的 handledType
不知何故被设置为 List
而不是 List<Foo>
但我不知道如何解决这个问题,因为参数化类型似乎没有 class。
我能做什么?
使用 JavaType
而不是 Class
。
class FooSerializer extends StdSerializer<List<Foo>> {
FooSerializer(JavaType javaType) {
super(javaType);
}
....
}
然后像下面这样注册:
SimpleModule fooModule = new SimpleModule("Foo Module");
CollectionLikeType type = mapper.getTypeFactory().constructCollectionLikeType(ArrayList.class, Foo.class);
fooModule.addSerializer(new FooSerializer(type));
我意识到我只需要 Converter
而不是 Serializer
,我已经实现了以下内容:
public class FooConverter extends StdConverter<Foo, String> {
@Override
public String convert(Foo value) {
return value.getName();
}
public static SimpleModule getSimpleModule(){
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Foo.class, new StdDelegatingSerializer(new FooConverter()));
return simpleModule;
}
}
我注册如下:
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(TAGWrapper.class, new StdDelegatingSerializer(new TagWrapperConverter()));
objectMapper.registerModule()