2013-10-03 45 views
6

当使用Jackson的JSON模式模块时,不是序列化完整的图表,我想在遇到我的模型类之一时停止,并使用类名为另一个模式插入$ ref 。你能指导我到jackson-module-jsonSchema源码的正确位置开始修补吗?Jackson:使用引用生成模式

下面是一些代码来说明这个问题:

public static class Zoo { 
    public String name; 
    public List<Animal> animals; 
} 

public static class Animal { 
    public String species; 
} 

public static void main(String[] args) throws Exception { 
    SchemaFactoryWrapper visitor = new SchemaFactoryWrapper(); 

    ObjectMapper mapper = objectMapperFactory.getMapper(); 
    mapper.acceptJsonFormatVisitor(mapper.constructType(Zoo.class), visitor); 
    JsonSchema jsonSchema = visitor.finalSchema(); 

    System.out.println(mapper.writeValueAsString(jsonSchema)); 
} 

输出:

{ 
    "type" : "object", 
    "properties" : { 
    "animals" : { 
     "type" : "array", 
     "items" : { 
     "type" : "object", 
     "properties" : {   <---- Animal schema is inlined :-(
      "species" : { 
      "type" : "string" 
      } 
     } 
     } 
    }, 
    "name" : { 
     "type" : "string" 
    } 
    } 
} 

所需的输出:

{ 
    "type" : "object", 
    "properties" : { 
    "animals" : { 
     "type" : "array", 
     "items" : { 
     "$ref" : "#Animal"  <---- Reference to another schema :-) 
     } 
    }, 
    "name" : { 
     "type" : "string" 
    } 
    } 
} 

回答

0

您可以尝试使用下面的代码 -

ObjectMapper MAPPER = new ObjectMapper(); 
    SchemaFactoryWrapper visitor = new SchemaFactoryWrapper(); 

    JsonSchemaGenerator generator = new JsonSchemaGenerator(MAPPER); 

    JsonSchema jsonSchema = generator.generateSchema(MyBean.class); 

    System.out.println(MAPPER.writeValueAsString(jsonSchema)); 

但你的预期输出是无效的,也不会说$裁判,除非它已指定“动物”的模式至少一次。

{ 
    "type": "object", 
    "id": "urn:jsonschema:com:tibco:tea:agent:Zoo", 
    "properties": { 
     "animals": { 
      "type": "array", 
      "items": { 
       "type": "object", 
       "id": "urn:jsonschema:com:tibco:tea:agent:Animal", 
       "properties": { 
        "species": { 
         "type": "string" 
        } 
       } 
      } 
     }, 
     "name": { 
      "type": "string" 
     } 
    } 
} 
2

您可以使用HyperSchemaFactoryWrapper而不是SchemaFactoryWrapper。通过这种方式,您将获得嵌套实体的金字塔参考:

HyperSchemaFactoryWrapper visitor= new HyperSchemaFactoryWrapper(); 
ObjectMapper mapper = objectMapperFactory.getMapper(); 
mapper.acceptJsonFormatVisitor(mapper.constructType(Zoo.class), visitor); 
JsonSchema jsonSchema = visitor.finalSchema(); 

System.out.println(mapper.writeValueAsString(jsonSchema)); 
+0

对我没有效果。仍然生成ReferenceSchema,而不是解析的。 –