有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用JsonTypeInfo处理Jackson反序列化的java。Id.NAME

当我使用配置为的ObjectMapper时:

        DefaultTyping applicability = ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT;
        TypeResolverBuilder<?> typer = DefaultTypeResolverBuilder.construct(applicability, validator);
        String propertyName = "type";
        typer = typer.init(JsonTypeInfo.Id.NAME, null);
        typer = typer.inclusion(JsonTypeInfo.As.PROPERTY);
        typer = typer.typeProperty(propertyName);

        ObjectMapper mapper=new ObjectMapper();
        mapper.setDefaultTyping(typer);

它生成类似于JSON的内容:

 {
   "type": "ShortClassName",
   ...
 }

该类型没有预期的完整包名。但是,尝试使用此对象映射器反序列化会导致:

com.fasterxml.jackson.databind.exc.InvalidTypeIdException

如何将基本包名指定为对象映射器配置的一部分,以便序列化的JSON只有类名


共 (2) 个答案

  1. # 1 楼答案

    通过使用mapper.readerFor(...)并指定要提取的类型,可以为特定对象创建映射器,在本例中,这将是

    ObjectReader shortClassNameReader = mapper.readerFor(new TypeReference<ShortClassName>(){})
    

    其中ShortClassName是您的类名

    然后您可以使用这个ObjectReaderreadValue来反序列化JSON

  2. # 2 楼答案

    谢谢Ayk——如果类名本身就是要反序列化的类名,那么您的解决方案可以工作,但是如果它嵌套在另一个类的JSON中,那么它就不工作。然而,我通过定义一个自定义的typeIdResolver,分别将ID从idFromValuetypeFromId中的对象转换为/来实现它。这样就可以在全局范围内工作,而不需要对序列化中涉及的每个对象进行注释