json-schema:如何从一个json-schema转换到另一个

时间:2016-07-20 14:10:18

标签: javascript templates jsonschema json-ld

我有两个不同的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”以及如何实现“转换”功能。

2 个答案:

答案 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-LD文档可以通过多种方式表示为JSON对象。在JSON-LD中,这称为framing

这个想法是将您的日历描述为JSON-LD文档,可以将其框架化以匹配schemaA或schemaB。换句话说,JSON-LD文档是消除模式之间的歧义所需的上下文。我会举一个例子,但我不太了解JSON-LD。如果你认为它可以解决你的问题,我会留给你看看它。

答案 1 :(得分:2)

我相信像this这样的图书馆可以用来解决你的问题。 这并没有直接解决这个问题(从一个JSON模式转换到另一个JSON模式),但你可以做什么(我现在正在做的)如下:

  1. 为输入指定JSON架构
  2. 为输出指定JSON架构
  3. 指定映射模板(例如,使用我引用的库)。
  4. 当然,理想情况下,您不必同时执行23,但我没有找到自动执行此操作的内容。因此,例如,您可以指定映射模板并创建一些库函数,该函数将1中的JSON模式作为其输入,并在3中生成JSON模式作为其输出

    然而,这并非易事,所以目前我同时指定23

    此外,请注意,您不能12以某种方式自动生成3。这是因为有多个映射函数会将数据附加到架构1并生成符合架构2的数据。