Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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 property discovery扩展到;“捕获所有类型”;路?_Java_Json_Jackson_Jsonschema - Fatal编程技术网

Java 如何将Jackson property discovery扩展到;“捕获所有类型”;路?

Java 如何将Jackson property discovery扩展到;“捕获所有类型”;路?,java,json,jackson,jsonschema,Java,Json,Jackson,Jsonschema,在我的关于序列化的讨论之后,我想进一步支持JsonFormatVisitor 我有同样的要求,就是: 我有几种类型的对象(接口) 我事先不知道这些目标的类型 我无法在这些类型上添加批注 我可以反省所有这些对象以获取它们的状态数据 既然序列化工作正常,我需要生成JsonSchema,然后执行如下操作: SchemaFactoryWrapper visitor = WHAT? mapper.acceptJsonFormatVisitor( mapper.constructType( Foo.clas

在我的关于序列化的讨论之后,我想进一步支持
JsonFormatVisitor

我有同样的要求,就是:

  • 我有几种类型的对象(接口)
  • 我事先不知道这些目标的类型
  • 我无法在这些类型上添加批注
  • 我可以反省所有这些对象以获取它们的状态数据
  • 既然序列化工作正常,我需要生成JsonSchema,然后执行如下操作:

    SchemaFactoryWrapper visitor = WHAT?
    mapper.acceptJsonFormatVisitor( mapper.constructType( Foo.class ), visitor );
    JsonSchema jsonSchema = visitor.finalSchema();
    String schemaString = mapper.writeValueAsString( jsonSchema );
    
    我实现了一个
    SchemaFactoryWrapper
    ,调用了它的
    expectAnyFormat
    ,但我不知道在里面做什么。看起来“any”对象没有模式

    也许我可以去杰克逊的其他地方?也许可以扩展整个Bean/属性内省机制来支持完全不同的模型(即不是Bean)


    我有点迷路了,请帮我找到宝藏室:)

    我可以尝试提出一些可能有用的方法

    首先,即使您不能直接对类进行注释,“混合注释”也会有所帮助——不过,这确实假设了静态知识

    第二,由于模式生成使用用于序列化的类型检测,您可能需要注册自定义序列化程序;但这并不一定意味着必须全部手写。注册自定义序列化程序最灵活的方法是通过
    Module
    接口(mapper.registerModule(new MyModule());模块可以注册
    serializer
    实例,该实例在首次尝试为某个类型定位
    JsonSerializer
    时被调用(在此之后,实例将被缓存以用于相同类型的其他属性)。 在这里,您可以配置并返回自定义的
    JsonSerializer
    ;但它可能只需要处理与架构相关的回调(由架构生成器调用的回调)

    还可以扩展/修改属性发现机制;这是否更容易取决于。但要寻找的是通过模块注册
    BeanSerializerModifier
    。 它在构建
    BeanSerializer
    的过程中被调用(除非注册了更具体的内容,否则将使用通用的POJO序列化程序),您可以使用它添加/修改属性;或者只需完全替换生成的序列化程序(如果需要,还可以使用默认序列化程序链接自定义序列化程序)