2016-07-20 12 views
2

に1 JSONスキーマから変換する方法を私は2つの異なるjson-schemasありますJSONスキーマ:別の

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 version draft-04)

私の質問は簡単です。私は

validates(calendarA, schemaA); // true 

、すなわち、最初のスキーマを、次のJavaScriptオブジェクトのcalendarA」を持っている私はschemaAからschemaBに、すなわち、スキーマ間の変換を記述したいので、私は、入力としてcalendarAを渡して取得することができますスキーマBに適合する新しいcalendarB。コードに入れよう:

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

あなたの視点から見ると、あなたの意見はSkhemaAtoBの人から書いた方が良いでしょうか?私は基本的なJSON変換パッケージをたくさん見ましたが、それらのほとんどにあなたが取ることはありません外部のテンプレートとしてあなたの出力を指定するように私には思える

schemaB.properties.foo = schemaA.properties.dtstart 

:私は本当に、スキーマを使用してtransfomationsを記述するような何かをしたいですスキーマを考慮に入れます(結果はschemaBに関して無効です)。

ありがとうございます!

JG

PS:可能な場合、私には、JavaScriptベースのソリューションを好むが、私はすべての可能性には本当に開いています。

EDIT 1:@ jasonの答えを読んだ後に明確にするために、スキーマ間のこのような関係をどのように記述し、カレンダーを取得するためにそれらを適用するかが問題です。あなたが好むのであれば:

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

との質問に、その後、より良い「relationsAtoB」を説明し、どのように「変換」機能を実装する方法です。

+0

こんにちは、オブジェクトを作成する前にスキームデータを変換したり、既存のオブジェクトを別のオブジェクトに変更したりすることをお勧めしますか? – Appeiron

+0

'VAR calendarB = fromSchemaAtoB(calendarA、schemaA、schemaB);あなたは本当にあなたが代わりをObjectAを変異の' schemeB'に 'shemeA'を変換したい場合は、'、あなたが 'プロパティの関係を説明schemeB'テンプレートを必要とする代わりに、 'schemeA'に' schemeB'の専用プロパティーに変換します。テンプレートを作成したくない場合、 'fromSchemaAtoB()'はテンプレートなしですべての変換を実行する必要があります(これは非常にサポートされていないアプローチですので、CONFIGをメソッド自体の代わりに変更する方が良い)。 – Appeiron

+0

こんにちは。 「オブジェクトを作成する前にスキームデータを変換する」というのは、2番目のオブジェクトがまったく新しいオブジェクトであることを意味します。 2つ目の選択肢は、特にパフォーマンス上の理由から変更したい大きなオブジェクトに対しても非常に面白いです。私は、理想的なフレームワークは、両方の変換タイプ、つまり新しいオブジェクト全体を作成するデフォルトのタイプと、入力オブジェクトを変更する2つ目の変換タイプの両方を使用する必要があると思います。しかし、今は新しい対象です。ありがとう@Appeiron – user6614015

答えて

1

これは、JSONスキーマのために設計されたものではありません。ある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と呼ばれます。

アイデアは、あなたのカレンダーを、schemaAまたはschemaBのいずれかと一致するように枠を付けることができるJSON-LDドキュメントとして記述することです。言い換えれば、JSON-LDドキュメントは、スキーマ間のあいまいさを取り除くために必要なコンテキストです。私は例を示しますが、私はJSON-LDについてよく分かりません。私はそれがあなたの問題を解決するかもしれないと思えばそれを見てあなたにそれを残すでしょう。

+0

はただもちろん、スキーマ間の関係が提供されなければならないことを明確にする質問にはより多くの情報を追加して、あなたを@jasonありがとうございます。 JSON-LDは興味深いようです。フレーミングアプローチを使用してJSON-LDでこれを行う方法の例を教えてください。ありがとう。 – user6614015

1

thisのようなライブラリを使用して質問に対処できると思います。 これは、直接質問(他の1つのJSONスキーマからの変換)を扱っていませんが、あなたは何ができるか(私は現在やっている何をしている)以下の通りです:

  1. ご入力のためのJSONスキーマを指定
  2. 出力用のJSONスキーマを指定してください
  3. マッピングテンプレートを指定してください(たとえば、私が参照しているライブラリを使用しています)。もちろん

、理想的に、あなたは23の両方を行う必要がないだろうが、私はこれを自動的に行い、何かを発見していません。たとえば、マッピングテンプレートを指定して、それを入力として1のJSONスキーマと同様に受け取るライブラリ関数を作成し、その出力として3のJSONスキーマを生成することができます。

しかし、これは現時点では些細なことではないので、現在は23の両方を指定しています。

また、12を使用できず、何とか自動的に3が生成されることに注意してください。これは、スキーマ1に準拠するデータを取り、スキーマ2に準拠するデータを生成する複数のマッピング関数があるためです。

関連する問題