我有两个不同的json-schemas:
schemaA - > http://json-schema.org/calendar
中定义的日历
{
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "A representation of an event",
"type": "object",
"required": [ "dtstart", "summary" ],
"properties": {
"dtstart": {
"format": "date-time",
"type": "string",
"description": "Event starting time"
},
"dtend": {
"format": "date-time",
"type": "string",
"description": "Event ending time"
},
"summary": { "type": "string" },
"location": { "type": "string" },
"url": { "type": "string", "format": "uri" },
"duration": {
"format": "time",
"type": "string",
"description": "Event duration"
},
"rdate": {
"format": "date-time",
"type": "string",
"description": "Recurrence date"
},
"rrule": {
"type": "string",
"description": "Recurrence rule"
},
"category": { "type": "string" },
"description": { "type": "string" },
"geo": { "$ref": "http: //json-schema.org/geo" }
}
}
schemaB - >另一个日历架构(也是json-schema版本draft-04)
我的问题很简单。我有一个javascript对象'calendarA',它遵循第一个模式,即
validates(calendarA, schemaA); // true
我想描述模式之间的转换,即从schemaA到schemaB,因此我可以将calendarA作为输入传递,并获得适合schemaB的新calendarB。把它放在代码中:
var calendarB = fromSchemaAtoB(calendarA, schemaA, schemaB);
validates(calendarB, schemaB); // true
从你的观点来看,哪个是最好的方法/工具来自theSchemaAtoB人?我真的想用形式来描述变形,如:
schemaB.properties.foo = schemaA.properties.dtstart
我看到了很多基本的json转换包,但在我看来,在大多数情况下,你将输出指定为不考虑模式的外部模板(因此结果可能对schemaB无效)。 / p>
提前非常感谢!!
JG
PS:如果可能的话,我更喜欢基于javascript的解决方案,但我对任何可能性都持开放态度。
编辑1:在阅读@jason的回答后澄清一下,问题是如何更好地描述模式之间的关系以及如何应用它们来获取calendarB。所以,如果您愿意:
var calendarB = transform(calendarA, schemaA, schemaB, relationsAtoB);
validates(calendarB, schemaB); // true
然后问题是如何更好地描述“relationsAtoB”以及如何实现“转换”功能。
答案 0 :(得分:2)
这不是JSON Schema的设计目标。将JSON从一个JSON模式转换为另一个JSON模式需要人为变换提供上下文。
例如,对于人类来说,这是一个相当简单的转换。
<强> jsonA 强>
{
"key1": "value1",
"key2": "value2"
}
<强> schemaA 强>
{
"type": "object",
"additionalProperties": {
"type": "string"
}
}
<强> schemaB 强>
{
"type": "array",
"items": {
"type": "array",
"items": [
{ "type": "string" },
{ "type": "string" }
]
}
}
你能从这些信息中找出转变应该是什么吗?也许吧,但是有太多的歧义可以解决问题。此转换将对象转换为键/值对数组。
<强> jsonB 强>
[
["key1", "value1"],
["key2", "value2"]
]
由于比较模式的模糊性,几乎任何变换都必须根据具体情况手动完成。我不认为你会用这种方法走得很远。
您可能希望将JSON-LD作为替代方案。 JSON-LD文档将数据描述为有向图。因此,JSON-LD文档可以通过多种方式表示为JSON对象。在JSON-LD中,这称为framing。
这个想法是将您的日历描述为JSON-LD文档,可以将其框架化以匹配schemaA或schemaB。换句话说,JSON-LD文档是消除模式之间的歧义所需的上下文。我会举一个例子,但我不太了解JSON-LD。如果你认为它可以解决你的问题,我会留给你看看它。
答案 1 :(得分:2)
我相信像this这样的图书馆可以用来解决你的问题。 这并没有直接解决这个问题(从一个JSON模式转换到另一个JSON模式),但你可以做什么(我现在正在做的)如下:
当然,理想情况下,您不必同时执行2
和3
,但我没有找到自动执行此操作的内容。因此,例如,您可以指定映射模板并创建一些库函数,该函数将1
中的JSON模式作为其输入,并在3
中生成JSON模式作为其输出
然而,这并非易事,所以目前我同时指定2
和3
。
此外,请注意,您不能1
和2
以某种方式自动生成3
。这是因为有多个映射函数会将数据附加到架构1
并生成符合架构2
的数据。