Jackson: generate schemas with references

前端 未结 3 950
忘掉有多难
忘掉有多难 2021-01-18 01:20

When using Jackson\'s JSON schema module, instead of serializing the complete graph I\'d like to stop whenever one of my model classes is encountered, and use the class nam

相关标签:
3条回答
  • 2021-01-18 01:44

    You can try and use following code -

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

    But your expected output is not valid, it won't say $ref, unless it has specified the schema for "Animals" at least once.

    {
        "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"
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-18 01:45

    Here's a custom SchemaFactoryWrapper that solves the problem. No guarantees, but it seems to work pretty well with Jackson 2.4.3.

    UPDATE: With Jackson 2.5 onward it's a lot easier. Now you can specify a custom VisitorContext.

    0 讨论(0)
  • 2021-01-18 01:50

    You can use the HyperSchemaFactoryWrapper instead of SchemaFactoryWrapper. In this way you will get urn reference for nested entities:

    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 讨论(0)
提交回复
热议问题