2014-02-24 134 views
1

我们目前正在调查JSON作为我们系统的潜在API数据传输语言,并提出了有关使用JSON参考的问题。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 Reference draft状态:

实现可以选择替换的参考价值的参考。

这是否意味着在对JSON模式进行验证之前,我们被允许对文件进行“预处理”并将JSON Reference对象替换为已解析的字符串值?或者,引用仅限于对象类型?

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

回答

1

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

  • 验证
  • 之前解决JSON参考适应JSON架构允许JSON参考在某些地方

个人物,我觉得第一个选项是非常整洁。

您可能最终得到循环引用我想 - 我不知道您使用的验证器/语言,但tv4肯定可以处理它。

+0

我们将自行实施。我们的目标是尽可能地贴近可用的标准。如果将参考对象解析为不同的类型并不矛盾,那我们很好。谢谢。 – Dienes

+0

没问题。只要在文档中完全无歧义地说“JSON引用应该在验证发生之前就地解析”,我就没有看到任何错误。 – cloudfeet

+0

我用'tv4'做了一些实验,它似乎在数据本身中不允许'$ ref'。这是'tv4'的限制还是仅在模式定义中允许的引用? – Dienes