簡體   English   中英

json-schema:如何從一個json-schema轉換到另一個json-schema

[英]json-schema: how to transform from one json-schema to another

我有兩個不同的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

從您的觀點來看,哪個是最好的方法/工具來自SchemaAtoB人? 我真的想用描述模式來描述變形,例如:

schemaB.properties.foo = schemaA.properties.dtstart

我看到了許多基本的json轉換包,但在我看來,在大多數情況下,您將輸出指定為不考慮模式的外部模板(因此結果可能與schemaB無效)。

非常感謝你提前!!

JG

PS:如果可能的話,我更喜歡基於javascript的解決方案,但我對任何可能性都很開放。

編輯1:在閱讀@jason的答案之后澄清一下,問題是如何更好地描述模式之間的關系以及如何應用它們來獲取calendarB。 所以,如果您願意:

var calendarB = transform(calendarA, schemaA, schemaB, relationsAtoB);
validates(calendarB, schemaB); // true

那么問題是如何更好地描述“relationsAtoB”以及如何實現“轉換”功能。

這不是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中,這稱為框架

我們的想法是將您的日歷描述為JSON-LD文檔,可以將其框架化以匹配schemaA或schemaB。 換句話說,JSON-LD文檔是消除模式之間的歧義所需的上下文。 我會舉一個例子,但我不太了解JSON-LD。 如果你認為它可以解決你的問題,我會留給你看看它。

我相信像這樣的圖書館可以用來解決你的問題。 這並沒有直接解決問題(從一個JSON模式轉換到另一個JSON模式),但你可以做什么(我現在正在做的)如下:

  1. 為輸入指定JSON模式
  2. 為輸出指定JSON模式
  3. 指定映射模板(例如,使用我引用的庫)。

當然,理想情況下,您不必同時執行23但我沒有找到自動執行此操作的內容。 因此,例如,您可以指定映射模板並創建一些庫函數,該函數將1以及1中的JSON模式作為其輸入,並將在3生成JSON模式作為其輸出。

然而,這並非易事,所以目前我正在指定23

此外,請記住,你不能有12並以某種方式自動生成3 這是因為有多個映射函數會將數據附加到模式1並生成遵循模式2數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM