0
私はjacksonとjackson-module-jsonSchemaを使用してjsonを逆シリアル化し、jsonスキーマを生成して(on fly)、json-schema-validatorでjsonを検証します。jackson jsonSchema:プロパティ(JsonRawValue)の型オブジェクトを設定する方法
フィールド「payload」を持つクラスがあります。このフィールドにはraw jsonが含まれている必要があります。これは、クライアントが必要とするプロパティがすべて存在する可能性があるためです。例:
{
"author": "test",
"payload": {
"title": "Test title"
}
}
フィールドペイロードのスキーマには「オブジェクト」タイプがありますが、タイプは「文字列」です。どのように私はスキームジェネレータにそれをオブジェクトにするように指示する必要がありますか?
クラス:
import com.fasterxml.jackson.annotation.JsonRawValue;
import com.fasterxml.jackson.databind.JsonNode;
public class Book {
private String author;
private Object payload;
@JsonRawValue
public Object getPayload() {
return payload;
}
public void setPayload(JsonNode node) {
this.payload = node;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "Book{" +
"author='" + author + '\'' +
", payload=" + payload +
'}';
}
}
私のテスト:
@Test
public void generateSchemaBook() throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new SimpleModule());
JsonSchemaGenerator schemaGen = new JsonSchemaGenerator(mapper);
final JsonSchema jsonSchema = schemaGen.generateSchema(Book.class);
jsonSchema.set$schema("http://json-schema.org/draft-03/schema#");
final String schema = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonSchema);
/*
{
"type" : "object",
"id" : "urn:jsonschema:ru:infon:mas:protocol:Book",
"$schema" : "http://json-schema.org/draft-03/schema#",
"properties" : {
"author" : {
"type" : "string",
"required" : true
},
"payload" : {
"type" : "string",
"required" : true
}
}
}
*/
System.out.println(schema);
String testJson = "{\"author\":\"test\",\"payload\":{\"title\":\"Test title\"}}";
Book book = mapper.readValue(testJson, Book.class);
System.out.println(book);
assertEquals("{\"title\":\"Test title\"}", book.getPayload().toString());
ProcessingReport validate = JsonSchemaFactory.byDefault().getJsonSchema(JsonLoader.fromString(schema)).validate(JsonLoader.fromString(testJson));
assertTrue(validate.isSuccess());
}