Big6Consultant
Big6Consultant

Reputation: 79

JSON validation against JSON schemas: Why is this obvious JSON data not failing validation

This JSON file should fail validation but it does not. Someone tell me why.

Plug the below json data and schema into this web site, validate,
http://json-schema-validator.herokuapp.com and I get the same results in the Mule Validate JSON Schema. Its obviously does not comply with the schema (i added some fields, I misspelled some fields, the date-time value is not a real date time) but yet it does not fail it. Can someone tell me why?

JSON Schema:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://hud.gov/ocio/xsd/esb/serviceauditingframework/2.0#",
  "definitions": {
    "serviceAuditLogData": {
      "type": "object",
      "title": "serviceAuditLogData",
      "required": [
        "serviceRequestTimestamp",
        "sourceSystem"
      ],
      "properties": {
        "auditId": {
          "type": "string"
        },
        "serviceRequestTimestamp": {
          "type": "string",
          "format": "date-time"
        },
        "serviceProvider": {
          "type": "string"
        },
        "serviceProviderVersion": {
          "type": "string"
        },
        "serviceProviderTimestamp": {
          "type": "string",
          "format": "date-time"
        },
        "eventType": {
          "type": "string"
        },
        "eventDetail": {
          "type": "string"
        },
        "hostName": {
          "type": "string"
        },
        "sourceSystem": {
          "type": "string"
        },
        "authenticationId": {
          "type": "string"
        },
        "endUserId": {
          "type": "string"
        },
        "inputData": {
          "type": "string"
        }
      },
      "propertiesOrder": [
        "auditId",
        "serviceRequestTimestamp",
        "serviceProvider",
        "serviceProviderVersion",
        "serviceProviderTimestamp",
        "eventType",
        "eventDetail",
        "hostName",
        "sourceSystem",
        "authenticationId",
        "endUserId",
        "inputData"
      ]
    }
  }
}

JSON Data

   {
      "serviceAuditLogData": {
        "junk":"asdfasdf",
        "serviceRequestTimestamp": "2004-09-29T12:58:31.470Z",
        "serviceProvider": "FLQS",
        "serviceProviderVersion": "v1.0.1",
        "audit_id": "17f24136-2494-4bf8-9d3b-9baafaae0cc9",
        "serviceProviderTimestamp": "2012-11-04T21:44:57.997Z",
        "eventType": "Query Pool",
        "eventDetail": "default pool",
        "hostName": "esb-d-srv1.",
        "sourceSystem": "LRS",
        "authenticationId": "EsbLrsAccount",
        "endUserId": "H574857",
        "inputData": "L234234234, L32453462345, L23452346"
      }
    }

Upvotes: 0

Views: 579

Answers (2)

Big6Consultant
Big6Consultant

Reputation: 79

Thanks @jruizaranguren I also learned that I needed to place "additionalProperties": false, and "required": to make sure that whats' being passed in the API is what's expected.

The below is how I solved my problem.

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "definitions": {
    "serviceAuditLogData": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "auditCorrelationId",
        "serviceRequestTimestamp",
        "serviceProvider",
        "serviceProviderVersion",
        "serviceProviderTimestamp",
        "eventType",
        "hostName",
        "sourceSystem",
        "authenticationId"
      ],
      "properties": {
        "auditCorrelationId": {
          "type": "string"
        },
        "serviceRequestTimestamp": {
          "type": "string",
          "format": "date-time"
        },
        "serviceProvider": {
          "type": "string"
        },
        "serviceProviderVersion": {
          "type": "string"
        },
        "serviceProviderTimestamp": {
          "type": "string",
          "format": "date-time"
        },
        "eventType": {
          "type": "string"
        },
        "eventDetail": {
          "type": "string"
        },
        "hostName": {
          "type": "string"
        },
        "sourceSystem": {
          "type": "string"
        },
        "authenticationId": {
          "type": "string"
        },
        "endUserId": {
          "type": "string"
        },
        "inputData": {
          "type": "string"
        }
      }
    }
  },
  "additionalProperties": false,
  "required": [
    "serviceAuditLogData"
  ],
  "properties": {
    "serviceAuditLogData": {
      "$ref": "#/definitions/serviceAuditLogData"
    }
  }
}

Upvotes: 0

jruizaranguren
jruizaranguren

Reputation: 13597

It does not fail because your schema does not enforce any constraint. Notice that definitions is not a jsonschema keyword that constraints validation. It is normally used to place sub-schemas that are re-used in other parts of the schema definition. Thus, to start with, you should change the definitions keyword for properties.

Another common misunderstanding with jsonschema is related to the properties keyword. Let's take the following example:

{
    "type" : "object",
    "properties" : {
        "key1" : {
            "type" : "string"
        }
    }
}

You must read it as: json must be an object, and in the case that it contains a key equal to key1, its value must be a string. According to that the following two json objects are valid:

{
    "key2":12
}

And:

{
    "key1":"sdf"
}

Finally, related to date-time format, you must check the section 6 of RFC3339 to be sure you have a valid date-time. And in any case, the implementation of formats is not compulsory in jsonschema validators.

Upvotes: 1

Related Questions