Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向Jackson提供自定义对象实例而不提供TypeInfo_Java_Json_Jackson_Jackson Databind - Fatal编程技术网

Java 向Jackson提供自定义对象实例而不提供TypeInfo

Java 向Jackson提供自定义对象实例而不提供TypeInfo,java,json,jackson,jackson-databind,Java,Json,Jackson,Jackson Databind,我试图使用Jackson反序列化一些多态对象,但我不想在JSON中公开类型信息。假设我们有一个经典的动物场景: 公共界面动物{ 弦乐; } 公营狗具动物{ 公共字符串对话{回音呜呜!;} } 公营猫科动物{ 公共字符串对话{返回喵!;} } 我还有一个工厂接口和多个工厂实现: 公共界面动物学{ 新动物; } 公共类DogFactory实现AnimalFactory{ 公共动物新动物{归还新狗;} } 公共类CatFactory实现AnimalFactory{ 公共动物新动物{返回新猫;} } 因

我试图使用Jackson反序列化一些多态对象,但我不想在JSON中公开类型信息。假设我们有一个经典的动物场景:

公共界面动物{ 弦乐; } 公营狗具动物{ 公共字符串对话{回音呜呜!;} } 公营猫科动物{ 公共字符串对话{返回喵!;} } 我还有一个工厂接口和多个工厂实现:

公共界面动物学{ 新动物; } 公共类DogFactory实现AnimalFactory{ 公共动物新动物{归还新狗;} } 公共类CatFactory实现AnimalFactory{ 公共动物新动物{返回新猫;} } 因为我不想通过在JSON中使用@JsonTypeInfo和类型参数来污染JSON的实现细节,所以我只知道两种选择:

在Animal上使用@JsonDeserializeas=Dog.class,但这需要API与实现类之间的显式依赖关系;此外,它总是将JSON反序列化为Dog,而我只想在运行时找到一个合适的具体实现,因为我不知道哪个具体实现可用; 使用StdDeserializer子类: 公共类AnimalDeserializer扩展StdDeserializer{ //通过依赖注入或其他机制获得 私人畜牧业; 公共动物杀虫剂{ 这是无效的; } 公共动物研究中心{ 超级VC; } @凌驾 公共动物反序列化JSONParser p,反序列化上下文ctxt抛出IOException,JsonProcessingException{ 返回animalFactory.newAnimal; } 这种方法允许我在运行时定位实现,但它也要求我手动设置和获取任何字段,而不是依赖于数据绑定。当然,在这种特定情况下,这将是微不足道的,但我的对象非常复杂,我也有许多不同的接口,所以我真的需要依赖于数据绑定

所以,我的问题是:我是否有另一种方法可以手动提供一个具体的动物实例,然后让Jackson执行它的数据绑定魔术,而不是手动实现所有的实例?作为参考,如果有人对JAXB有一些经验,比如@XmlRegistry,我可以为给定的接口指定一个工厂,这将非常棒。

谢谢

编辑:可能不太清楚,但我不想在JSON中放入要反序列化的类型属性,因为我不想在那里公开实现细节,所以@JsonTypeInfo不是一个选项,很遗憾。

您可以使用@JsonTypeInfo和@JsonSubtypes来自动支持多态性

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Cat.class, name = "cat"),
    @JsonSubTypes.Type(value = Dog.class, name = "dog")
})

public interface Animal {
    String talk();
}
您可以使用@JsonTypeInfo和@JsonSubtypes来自动支持多态性

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Cat.class, name = "cat"),
    @JsonSubTypes.Type(value = Dog.class, name = "dog")
})

public interface Animal {
    String talk();
}

但是这样的话,我需要在我的JSON中添加一个type属性,这正是我想在阅读文章时首先避免的事情:EDIT:无论如何,我会让文章更清楚,感谢Feedback,但是这样的话,我需要在我的JSON中添加一个type属性,这正是我想在阅读po时首先避免的事情编辑:不管怎样,我会把帖子说得更清楚,谢谢你的反馈