Json Jackson序列化程序调用了错误的类型

Json Jackson序列化程序调用了错误的类型,json,list,serialization,jackson,objectmapper,Json,List,Serialization,Jackson,Objectmapper,我正在与Jackson合作,并编写了以下自定义序列化程序: public class FooSerializer extends StdSerializer<List<Foo>> { public FooSerializer() { this(null); } public FooSerializer(Class<List<Foo>> t) { super(t); } public void seriali

我正在与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();
  }
}
我希望它获取一个包含
Foo
s的
列表的对象,然后像

{
  ...
  "foos":["name1", "name2"]
  ...
}
这很好,但是,当我传递一个
SomeObjectHoldingFoos的
List
,每个都持有一个
List
Foo
,ObjectMapper试图将
foosSerializer
应用到这个
列表
时,导致
Foo不能被强制转换到SomeObjectHoldingFoos
异常

我怀疑
FooSerializer
handledType
以某种方式被设置为
List
,而不是
List
,但我不知道如何解决这个问题,因为似乎没有参数化类型的类


我能做什么?

使用
JavaType
而不是
Class

class FooSerializer extends StdSerializer<List<Foo>> {

    FooSerializer(JavaType javaType) {
        super(javaType);
    }

    ....
}

我意识到我只需要一个
转换器
,而不是
序列化器
,我实现了以下功能:

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;
  }
}

刚刚看完代码,我想知道addSerializer部分中的List.class是否可以替换为List.class。我已经找到了另一个使用
StdConverter
的解决方案,但这也很有效,谢谢。
SimpleModule fooModule = new SimpleModule("Foo Module");
CollectionLikeType type = mapper.getTypeFactory().constructCollectionLikeType(ArrayList.class, Foo.class);
fooModule.addSerializer(new FooSerializer(type));
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()