2016-07-22 38 views
0

私はjacksonjackson-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()); 
} 

答えて

0

私はその場でこれを行うための解決策を見つけると、いったんJSONスキーマを生成することを決定し、ファイルにそれを置くと、負荷はなかったです。

関連する問題