2016-07-22 9 views
0

Ich benutze und jackson-module-jsonSchema um json zu deserialisieren und json schema (on fly) zu generieren, um json durch json-schema-validator zu validieren.jackson jsonSchema: Wie man ein Objekt für die Eigenschaft (JsonRawValue) setzt

Ich habe eine Klasse mit Feld "Nutzlast". Dieses Feld sollte "row json" enthalten, da es Eigenschaften geben kann, die der Client benötigt. Zum Beispiel:

{ 
    "author": "test", 
    "payload": { 
     "title": "Test title" 
    } 
} 

erwarte ich, dass Feld Nutzlasttyp „Objekt“ im Schema hat, aber es ist „string“ eingeben. Wie soll ich dem Schema-Generator sagen, dass es ein Objekt ist ???

Klasse:

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 + 
      '}'; 
    } 
} 

Mein Test:

@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()); 
} 

Antwort

0

ich nicht Lösung fand dies auf Fly zu tun und beschlossen, json Schema einmal zu erzeugen, setzen Sie es und laden die Datei.

Verwandte Themen