我们目前正在调查JSON作为我们系统的潜在API数据传输语言,并提出了有关使用JSON参考的问题。JSON参考非对象值
请看下面的例子:
{
"invoice-address" : { "street": "John Street", "zip": "12345", "city": "Someville" },
"shipping-address": { "$ref": "#/invoice-address" }
}
根据我们的研究,这是JSON参考的有效使用。我们用另一个包含引用的对象替换对象的实例,使用JSON指针片段指向不同的对象。
现在,JSON引用总是由一个键值对组成,因此必须包含在一个对象中。这意味着,为了引用非对象数据类型(例如:zip
和city
串在上面的例子),你就必须做到以下几点:
{
"invoice-address" : { "street": "John Street", "zip": "12345", "city": "Someville" },
"shipping-address": { "street": "Doe Street", "zip": { "$ref": "#/invoice-address/zip" }, "city": { "$ref": "#/invoice-address/city" } }
}
即使JSON指针现在正确地指向字符串值,我们不得不将字符串zip
和city
的数据类型从字符串更改为对象,这使得它们无法对我们的JSON模式进行验证,因为它将它们声明为字符串。
然而,JSON Reference draft状态:
实现可以选择替换的参考价值的参考。
这是否意味着在对JSON模式进行验证之前,我们被允许对文件进行“预处理”并将JSON Reference对象替换为已解析的字符串值?或者,引用仅限于对象类型?
感谢任何能够阐明这一点的人。
我们将自行实施。我们的目标是尽可能地贴近可用的标准。如果将参考对象解析为不同的类型并不矛盾,那我们很好。谢谢。 – Dienes
没问题。只要在文档中完全无歧义地说“JSON引用应该在验证发生之前就地解析”,我就没有看到任何错误。 – cloudfeet
我用'tv4'做了一些实验,它似乎在数据本身中不允许'$ ref'。这是'tv4'的限制还是仅在模式定义中允许的引用? – Dienes