jackson 我如何生成JSON模式与一个必需的字段或默认值?

s2j5cfk0  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(224)

我使用Jackson来处理JSON对象,并且我希望有一种方法可以从一个类中生成一个模式,并且可以在对象上强制执行。我发现我可以使用以下方法:

JsonSchemaGenerator generator = new JsonSchemaGenerator(mapper);
JsonSchema jsonSchema = generator.generateSchema(DBUser.class);
mapper.writeValueAsString(jsonSchema);

使用这个com.fasterxml.jackson.module.jsonSchema.jsonSchemaGenerator来执行。
从此类生成:

public class DBUser {

    private String database="stu";
    private int role;
    private String username;
    private String password;
    //setters and getters defined
    }

这就给了我这个:

{
  "type" : "object",
  "id" : "urn:jsonschema:DBUser",
  "properties" : {
    "database" : {
      "type" : "string"
    },
    "role" : {
      "type" : "integer"
    },
    "username" : {
      "type" : "string"
    },
    "password" : {
      "type" : "string"
    }
  }
}

我需要的是一个必填字段,如下所示:

"required": ["database","role","username"]

但是它没有我需要的必填字段,或者初始值。那么我怎么能得到它呢?

5lhxktic

5lhxktic1#

您可以通过将JsonProperty#required设置为true来注解pojo DBUser类字段,以生成具有必需字段的jsonschema:

public class DBUser {

    @JsonProperty(required = true)
    private String database = "stu";
    @JsonProperty(required = true)
    private int role;
    @JsonProperty(required = true)
    private String username;
    private String password;
}

//generate the new jsonschema with the required fields
JsonSchemaGenerator generator = new JsonSchemaGenerator(mapper);
JsonSchema jsonSchema = generator.generateSchema(DBUser.class);
System.out.println(mapper.writerWithDefaultPrettyPrinter()
                         .writeValueAsString(jsonSchema));

//json generated
{
  "type" : "object",
  "id" : "urn:jsonschema:DBUser",
  "properties" : {
    "database" : {
      "type" : "string",
      "required" : true
    },
    "role" : {
      "type" : "integer",
      "required" : true
    },
    "username" : {
      "type" : "string",
      "required" : true
    },
    "password" : {
      "type" : "string"
    }
  }
}

请注意,根据documentation,jsonschema模块支持创建JSON模式(v3),而不支持创建更高的JSON模式版本,因此不支持在更高版本中引入的关键字。

相关问题