对非对象值的JSON引用



我们目前正在研究JSON作为我们系统的潜在API数据传输语言,并提出了关于使用JSON引用的问题。

考虑以下示例:

{
"invoice-address" : { "street": "John Street", "zip": "12345", "city": "Someville" },
"shipping-address": { "$ref": "#/invoice-address" }
}

根据我们的研究,这是JSON引用的有效用法。我们使用JSON指针片段将一个对象的实例替换为另一个包含指向不同对象的引用的对象。

现在,JSON引用总是由键值对组成,因此必须包含在对象中。这意味着,为了引用非对象数据类型(例如,上例中的zipcity字符串),您必须执行以下操作:

{
"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指针现在正确地指向字符串值,但我们不得不将zipcity的数据类型从字符串更改为对象,这使得它们无法通过JSON模式的验证,因为它将它们声明为字符串。

然而,JSON参考草案指出:

实现可以选择用引用的值替换引用。

这是否意味着我们被允许";预处理";文件,并在根据JSON模式进行验证之前用解析的字符串值替换JSON引用对象?还是引用仅限于对象类型?

感谢所有能对此有所了解的人。

我不希望大多数验证器在验证之前解析JSON引用。你可以:

  • 在验证前解析JSON引用
  • 调整JSON模式以允许在某些地方使用JSON引用对象

就我个人而言,我认为第一种选择要整洁得多。

我想,你最终可能会得到循环引用——我不知道你使用的是哪种验证器/语言,但tv4肯定可以处理它

最新更新