【问题标题】:How to get a json schema from another file?如何从另一个文件中获取 json 模式?
【发布时间】:2014-05-15 03:58:15
【问题描述】:

我想知道如何从其他文件中获取 json 架构。

假设我有两个文件,放在同一个目录下:

文件 1:person.json

{
    "id":"#person",
    "name": {"type":"string"},
    "age": {"type":"number"},
    "address": {
        "type":"object",
        "properties": {
            "number": {"type":"number"},
            "street": {"type":"string"},
            "city": {"type":"string"}
        }
    }
}

文件 2:company.json

{
    "id":"#company",
    "name": {"type":"string"},
    "employees": {
        "type":"array",
        "items" {"$ref":"person.json"}
    }
}

如您所见,“员工”应该是“人”的数组。问题是我不知道如何引用“人”模式,因为它在不同的文件中。

我知道这可能是一个简单的问题,并且可能已经有答案,但我已经研究了很多,但我不明白这是如何完成的。

编辑 1

我正在使用Tiny Validator 4 (tv4) 进行架构验证。我还使用 QUnit 来测试模式是否正常工作。

下面,我将向您展示一个测试,其中地址编号应该是数字类型时是布尔值。架构在不应该进行验证时进行验证。

asyncTest("invalid type for adress number", function() {
    expect(1);
    var jsonObject = {
        name: 'Computers Inc',
        employees: [
            {
                name: 'John',
                age: 29,
                address: {
                    number: 9,
                    street: 'Oak Street',
                    city: 'London'
                }
            },
            {
                name: 'Mike',
                age: 35,
                address: {
                    number: true,
                    street: 'Big Avenue',
                    city: 'London'
                }
            }
        ]
    };

    // Gets the JSON Schema
    $.getJSON('json_schemas/company.json', function(response) {
        var jsonSchema = response;
        console.log(jsonSchema);

        // Verifies the validity of the JSON object
        var valid = tv4.validate(jsonObject, jsonSchema);
        ok(!valid, "Not valid because Mike's number is a boolean.");
        start();
    });
});

看了一会,觉得是“$.getJSON”搞砸了。 “console.log(jsonSchema)”显示获取的架构不包括人员部分。获取的架构正是“company.json”文件中的架构。

编辑 2

我认为它是这样工作的。 :)

asyncTest("invalid type for address number", function() {
    expect(1);
    var jsonObject = {
        name: 'Computers Inc',
        employees: [
            {
                name: 'John',
                age: 29,
                address: {
                    number: 9,
                    street: 'Oak Street',
                    city: 'London'
                }
            },
            {
                name: 'Mike',
                age: 35,
                address: {
                    number: false,
                    street: 'Big Avenue',
                    city: 'London'
                }
            }
        ]
    };

    tv4.asyncValidate(jsonObject, 'json_schemas/company.json', function(valid) {
        ok(!valid, printMessage(valid));
        start();
    });
});

【问题讨论】:

  • 你在那里的东西看起来应该可以工作。你看到了什么问题?
  • 感谢您的回答@cloudfeet。我在 EDIT 1 中添加了更多细节。获取模式进行验证似乎是一个问题。请你看一下好吗?再次感谢。 ;)

标签: file reference jsonschema


【解决方案1】:

您的架构看起来应该可以工作 - 所以我的猜测是您没有正确地将架构加载到您的验证器中。

使用tv4(您显然正在使用),您应该能够使用结果的"missing" 属性查看是否缺少任何架构。

var result = tv4.validateMultiple(data, schema);
console.log(result.missing); // ['/json_schemas/missing-schema']

要解决此问题,您需要在验证之前将所需的任何架构加载到 tv4

tv4.addSchema('/json_schemas/missing-schema', ...)

还有一个示例脚本添加了 tv4.asyncValidate(data, schema, callback) 方法,该方法使用 jQuery 获取丢失的模式并重试,这可能对您有用。

【讨论】:

  • 谢谢你,@cloudfeet。 ;) 我认为 tv4.asyncValidate 保存了这件事。你能看看我的 EDIT 2 吗?我想我正确地使用了它。非常感谢。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 2017-10-24
  • 1970-01-01
相关资源
最近更新 更多