JSON引用非对象值

时间:2014-02-24 12:09:13

标签: json reference jsonschema

我们目前正在调查JSON作为我们系统的潜在API数据传输语言,并提出了有关使用JSON Reference的问题。

考虑以下示例:

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

根据我们的研究,这是JSON Reference的有效用法。我们使用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 Reference draft州:

  

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

这是否意味着我们被允许“预处理”该文件并使用已解析的字符串值替换JSON Reference对象,然后再针对JSON Schema进行验证?或者仅限于对象类型的引用?

感谢任何能够阐明这一点的人。

1 个答案:

答案 0 :(得分:1)

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

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

就个人而言,我认为第一种选择更加整洁。

我猜你最终会得到循环引用 - 我不知道你正在使用哪种验证器/语言,但tv4肯定可以处理它。