2016-04-21 90 views
7

我已经看到了这个other question但它不完全相同,我觉得我的问题更简单,但只是不起作用。对象数组的JSON模式定义

我的数据是这样的:

[ 
    { "loc": "a value 1", "toll" : null, "message" : "message is sometimes null"}, 
    { "loc": "a value 2", "toll" : "toll is sometimes null", "message" : null} 
] 

我想在一个Node.js的项目中使用AJV的JSON验证,我已经尝试了几种模式,试图来形容我的数据,但我总是这样的错误:

[ { keyword: 'type', 
    dataPath: '', 
    schemaPath: '#/type', 
    params: { type: 'array' }, 
    message: 'should be array' } ] 

架构我已经试过这个样子的:

{ 
    "type": "array", 
    "items": { 
    "type": "object", 
    "properties": { 
     "loc": { 
     "type": "string" 
     }, 
     "toll": { 
     "type": "string" 
     }, 
     "message": { 
     "type": "string" 
     } 
    }, 
    "required": [ 
     "loc" 
    ] 
    } 
} 

我也尝试使用this online tool来生成架构,但这也不起作用,并且为了验证这应该输出正确的结果,我试着对jsonschemavalidator.net进行验证,但是这也给我带来了类似的错误:

Found 1 error(s) 
Message: 
Invalid type. Expected Array but got Object. 
Schema path: 
#/type 

回答

16

您已经正确定义了您的模式,只是它与您所说的验证数据不匹配。如果您更改属性名称以匹配模式,您仍然有一个问题。如果您想允许“收费”和“消息”为空,您可以执行以下操作。

{ 
    "type": "array", 
    "items": { 
    "type": "object", 
    "properties": { 
     "loc": { 
     "type": "string" 
     }, 
     "toll": { 
     "type": ["string", "null"] 
     }, 
     "message": { 
     "type": ["string", "null"] 
     } 
    }, 
    "required": [ 
     "loc" 
    ] 
    } 
} 

但是,这与您所得到的错误消息无关。该消息意味着您正在验证的数据不是数组。您发布的示例数据不应导致此错误。你是否在问题中发布的内容之外运行验证器?

+0

我甚至没有对数据进行验证,现在我只是试图验证模式本身。 –

+0

@KyleFalconer,你的模式是有效的。我试过你链接的验证器。我认为你遇到的问题是它默认将'{}'放在“输入JSON”字段中。您需要将其更改为数组。该工具看起来像错误与模式有关,但它实际上是无效的数据。 – Jason

+0

当然,你是对的!谢谢一堆! –