如何使用JSON Schema验证表单?

时间:2013-08-06 04:53:42

标签: javascript json validation jsonschema

我想使用描述它的JSON Schema验证HTML表单的输入。我正在使用Gary Court的JSV来验证它并且它一致地返回错误。我使用JSON Schema Lint(jsonschemalint.com)来检查我的架构。在Chrome Schema中,Lint告诉我我的架构是有效的,但在Firefox,Safari& Opera网站告诉我,我的架构是有效的JSON,但不是有效的JSON架构。谁能帮我吗。我的架构如下。

更新日期8/6/13 感谢您的回复。我更新的JSON(下面更新)现在在所有浏览器中都有效。但是我仍然从JSV得到以下错误:

Report {errors: Array[1], validated: Object, instance: JSONInstance, schema: JSONSchema,   schemaSchema: JSONSchema…}
errors: Array[1]
    0: Object
        attribute: "type"
        details: Array[1]
            0: "object"
            length: 1
            __proto__: Array[0]
        message: "Instance is not a required type"
        schemaUri: "http://json-schema.org/draft-03/hyper-schema#"
        uri: "urn:uuid:808fe74b-b0d0-4774-8975-289f105dfeaa#"
        __proto__: Object
    length: 1
    __proto__: Array[0]
instance: JSONInstance
schema: JSONSchema
schemaSchema: JSONSchema
validated: Object
__proto__: Report

首先我要说的是我可能错误地解释了错误消息。但是我很确定这是指在开头大括号之后的"type": "object"行。但是"type": "object"键:值是{03}草案03规范的一部分。这很令人困惑,因为JSON Schema Lint也使用JSV库...感谢您的帮助到目前为止。

{
"type": "object",
"$schema": "http://json-schema.org/draft-03/schema#",
"title": "FormValidation",
"description": "Describes the types of and valid inputs to a form generated via Form Creator",
"properties": {
    "Air Temperature (C)": {
        "type": "number",
        "description": "Air Temperature measurement in centigrade.",
        "required": false
    },
    "Ammonia": {
        "type": "number",
        "description": "Ammonia measurement at test site.",
        "required": false
    },
    "Aquatic Life Present": {
        "type": "string",
        "description": "Are organisms such as fish or frogs living near the test site?",
        "required": false
    },
    "Chlorophyll a": {
        "type": "number",
        "description": "Chlorophyll a measurement at test site.",
        "required": false
    },
    "Conductivity": {
        "type": "number",
        "description": "Water conductivity measurement at test site.",
        "required": false
    },
    "Date of Test": {
        "type": "string",
        "description": "Date the measurements were recorded.",
        "required": true
    },
    "Dissolved Oxygen 1": {
        "type": "number",
        "description": "Disolved oxygen reading at first depth.",
        "required": false
    },
    "Dissolved Oxygen 2": {
        "type": "number",
        "description": "Dissolved oxygen reading at second depth.",
        "required": false
    },
    "Latitude": {
        "type": "number",
        "description": "Latitude of the measurement site in degrees.",
        "required": true
    },
    "Longitude": {
        "type": "number",
        "description": "Longitude of the measurement site in degrees.",
        "required": true
    },
    "Nitrates": {
        "type": "number",
        "description": "Nitrate measurement at test site.",
        "required": false
    },
    "Orthophosphates": {
        "type": "number",
        "description": "Orthophosphate measurement at site of testing.",
        "required": false
    },
    "Phosphates": {
        "type": "number",
        "description": "Phosphate reading at measurement site.",
        "required": false
    },
    "Secchi Disk": {
        "type": "number",
        "description": "Secchi Disk depth reading at measurement site.",
        "required": false
    },
    "Site Change": {
        "type": "string",
        "description": "Has the site undergone noticeable physical change since the last measuring event?",
        "required": false
    },
    "Test Site": {
        "type": "string",
        "description": "Location where the measurements were recorded.",
        "required": true
    },
    "Turbidity (ntu)": {
        "type": "number",
        "description": "Cloudiness or haziness of water, measured in Nephelometric Turbidity Units (NTU).",
        "required": false
    },
    "Water Color or Odor": {
        "type": "string",
        "description": "Does the water have an strange colorations or emit a noticeable odor?",
        "required": false
    },
    "Water Temperature (C)": {
        "type": "number",
        "description": "Water Temperature measurement in centigrade.",
        "required": false
    },
    "pH": {
        "type": "number",
        "description": "pH measurement at test site.",
        "required": false
    }
}
}

2 个答案:

答案 0 :(得分:4)

我在the JSON schema website中再次检查了它,似乎名称"Turbidity (ntu)"不是有效密钥。 JSON schema不喜欢密钥中的括号。如果你将括号括起来,就像"Turbidity ntu"一样。

当他明显撤回@ pmagunia的条目时,我只是在评论它。他说required只能包含布尔值。 在我看来,顶部的required属性实际上是多余的。我刚刚在JSON Schema Lint中对它进行了测试,如果没有它,架构被认为是有效的。但是required肯定只能 保持布尔值。你的阵列

[ "TestSite", "Date of Test", "Latitude", "Longitude" ]

由JSON Schema Lint转换为不带引号的字符串

TestSite,Date of Test,Latitude,Longitude

肯定是无效的JSON!

答案 1 :(得分:3)

你的json在键中有空格。像Air Temperature (C)一样。同时删除括号。如果要从密钥中删除空格,那么它将是有效的模式。