简体   繁体   中英

Issue with a Json schema validation

I'm running into an issue with a Json schema validation.

I have a Java class like this

package com.ebc.jackson.exampe.data;

public class FormElement {
    
    private String fieldName;
    
    private String fieldType;
    
    private Object value;

    public String getFieldName() {
        return fieldName;
    }

    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    public String getFieldType() {
        return fieldType;
    }

    public void setFieldType(String fieldType) {
        this.fieldType = fieldType;
    }

    public Object getValue() {
        return value;
    }

    public void setValue(Object value) {
        this.value = value;
    }
}

I'm using below code to generate the schema:

JsonSchemaGenerator generator =
                    new JsonSchemaGenerator(objectMapper);
            JsonNode schema = generator.generateJsonSchema(FormElement.class);
            String strSchema = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema);

this code generates below schema

{
  "$schema" : "http://json-schema.org/draft-04/schema#",
  "title" : "Form Element",
  "type" : "object",
  "additionalProperties" : false,
  "properties" : {
    "fieldName" : {
      "type" : "string"
    },
    "fieldType" : {
      "type" : "string"
    },
    "value" : {
      "$ref" : "#/definitions/Object"
    }
  },
  "definitions" : {
    "Object" : {
      "type" : "object",
      "additionalProperties" : false,
      "properties" : { }
    }
  }
}

In the request, I could receive a Json Object like

{
  "fieldName": "user-name",
  "fieldType": "textInput",
  "value": "Alex"
}

When I try to validate this object against the Json schema, "value" attribute is not valid, it is expecting a "key: value" pair but, a string is found. In the Java class the value attribute is Object because it could be a String, Integer, Boolean, etc.

My question is, how can I generate a schema to support different data types for "value" attribute?

You can use the anyOf property of schema:

Try the below one:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "Form Element",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "fieldName": {
      "type": "string"
    },
    "fieldType": {
      "type": "string"
    },
    "value": {
      "$ref": "#/definitions/Object"
    }
  },
  "definitions": {
    "Object": {
      "format": "",
      "anyOf": [
        {
          "type": "object"
        },
        {
          "type": "string"
        },
        {
          "type": "number"
        },
        {
          "type": "integer"
        },
        {
          "type": "boolean",
          "x-enumFlags": true
        },
        {
          "type": "null"
        }
      ],
      "additionalProperties": false,
      "properties": {}
    }
  }
}

Or you could try the pipe separator in type.In the schema you provided just change the value of type to "type": "string|object|integer|number". This notation didn't work for me in swagger but you can check if it works for you.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM