0

此 JSON 文件应验证失败,但事实并非如此。有人告诉我为什么。

将以下 json 数据和模式插入此网站,验证
http://json-schema-validator.herokuapp.com ,我在 Mule Validate JSON Schema 中得到相同的结果。它显然不符合模式(我添加了一些字段,我拼错了一些字段,日期时间值不是真正的日期时间)但它并没有失败。有人能告诉我为什么吗?

JSON模式:

{
  "$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数据

   {
      "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"
      }
    }
4

2 回答 2

1

它不会失败,因为您的架构不强制执行任何约束。请注意,这definitions不是jsonschema限制验证的关键字。它通常用于放置在模式定义的其他部分中重复使用的子模式。因此,首先,您应该更改definitions关键字 for properties

另一个常见的误解与关键字jsonschema有关。properties让我们看下面的例子:

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

你必须把它读成:json必须是一个对象,如果它包含一个等于 的键key1,它的值必须是一个字符串。据此,以下两个 json 对象是有效的:

{
    "key2":12
}

和:

{
    "key1":"sdf"
}

最后,关于date-time格式,您必须检查RFC3339 的第 6 节以确保您有一个有效的日期时间。无论如何,格式的实现在jsonschema验证器中不是强制性的。

于 2016-03-07T14:29:03.773 回答
0

谢谢@jruizaranguren,我还了解到我需要放置“additionalProperties”:false 和“required”:以确保在 API 中传递的内容符合预期。

以下是我如何解决我的问题。

{
  "$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"
    }
  }
}
于 2016-03-11T18:13:30.983 回答