2016-07-20 31 views
2

Ich habe die zwei verschiedenen json-schemas zu transformieren:json-Schema: Wie aus einem json-Schema in eine anderen

schemaA -> Ein Kalender, wie definiert in 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 -> Ein anderes Kalenderschema (auch json-schema version draft-04)

Meine Frage ist einfach. Ich habe ein Javascript-Objekt ‚calendarA‘, die das erste Schema folgt, das heißt

validates(calendarA, schemaA); // true 

Ich mag eine Transformation zwischen dem Schema beschreiben, dh von schemaA zu schemaB, so kann ich calendarA als Eingabe übergeben und ein neuer KalenderB, der zu SchemaB passt. Legen Sie es in Code:

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

Aus Ihrer Sicht, die die besten Ansatz/Tool fromSchemaAtoB Jungs zu schreiben? Ich möchte wirklich transfomations beschreiben die Schemata verwenden, so etwas wie:

schemaB.properties.foo = schemaA.properties.dtstart 

sah ich eine Menge von grundlegenden json Transformation Pakete, aber es scheint mir, dass in den meisten von ihnen Sie Ihre Ausgabe als externe Vorlagen angeben, die nicht nehmen Berücksichtigung der Schemata (Ergebnis könnte in Bezug auf SchemaB ungültig sein).

Vielen Dank im Voraus!

JG

PS: Ich bevor Javascript-basierten Lösungen, wenn möglich, aber ich bin wirklich offen für jede Möglichkeit.

EDIT 1: Um nach dem Lesen @ Jasons Antwort zu klären, ist die Frage, wie man solche Beziehungen zwischen Schemas besser beschreiben und wie man sie anwenden kann, um KalenderB zu erhalten. Also, wenn Sie bevorzugen:

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

und die Frage ist dann, wie man besser beschreiben „relationsAtoB“, und wie zur Umsetzung der „Transformation“ Funktion.

+0

Hallo, bitte sagen Sie mir, was bevorzugen Sie, um Schema-Daten zu transformieren, bevor Sie ein Objekt erstellen oder ein bestehendes Objekt zu einem anderen mutieren? – Appeiron

+0

'var calendarB = fromSchemaAtoB (calendarA, schemaA, schemaB);' Wenn Sie wirklich sicher sind, 'shemeA' in' schemaB' zu transformieren, anstatt ObjectA zu mutieren, benötigen Sie anstelle von 'schemeB' eine Vorlage, die die Beziehungen von Eigenschaften beschreibt in 'schemaA' zu dedizierten Eigenschaften in' schemeB'. Wenn Sie keine Templates erstellen möchten, sollte 'fromSchemaAtoB()' jede Transformation ohne Template durchführen (aber dies ist ein sehr untragbarer Ansatz, besser CONFIG anstelle der Methode selbst geändert zu haben) – Appeiron

+0

Hi. Wenn Sie unter "Transformieren von Schemadaten vor dem Erstellen eines Objekts" meinen, dass das zweite Objekt ein völlig neues Objekt ist, würde ich sagen, dass ich diese Option bevorzuge. Ihre zweite Option ist sehr interessant auch speziell für große Objekte, die ich aus Leistungsgründen mutieren möchte. Ich vermute, dass das ideale Framework beide Transformationstypen verwenden sollte, eine Standardmethode, die ein ganzes neues Objekt erstellt, und eine zweite, die das Eingabeobjekt mutiert. Aber für jetzt neue Objekte. Danke @Appeiron – user6614015

Antwort

1

Dies ist nicht etwas, für das JSON Schema entwickelt wurde. Wenn JSON von einem JSON-Schema in ein anderes JSON-Schema konvertiert werden soll, muss ein Benutzer einen Kontext für die Umwandlung bereitstellen.

Zum Beispiel ist hier eine ziemlich einfache Transformation für einen Menschen zu tun.

jsonA

{ 
    "key1": "value1", 
    "key2": "value2" 
} 

schemaA

{ 
    "type": "object", 
    "additionalProperties": { 
    "type": "string" 
    } 
} 

schemaB

{ 
    "type": "array", 
    "items": { 
    "type": "array", 
    "items": [ 
     { "type": "string" }, 
     { "type": "string" } 
    ] 
    } 
} 

Können Sie herausfinden, was Die Transformation sollte allein aus diesen Informationen stammen? Vielleicht, aber es gibt zu viele Unklarheiten, um es problematisch zu machen. Diese Umwandlung konvertiert ein Objekt in ein Array von Schlüssel/Wert-Paaren.

jsonB

[ 
    ["key1", "value1"], 
    ["key2", "value2"] 
] 

Wegen der Mehrdeutigkeit zu vergleichen Schemata, nur um irgendwelche Transformationen haben werden manuell auf einer Fall-zu-Fall-Basis durchgeführt werden. Ich denke nicht, dass Sie mit diesem Ansatz sehr weit kommen werden.

JSON-LD

Sie könnten in JSON-LD als Alternative zu suchen. Ein JSON-LD-Dokument beschreibt Daten als gerichtetes Diagramm. Folglich gibt es mehrere Möglichkeiten, wie ein JSON-LD-Dokument als JSON-Objekt ausgedrückt werden kann. In JSON-LD heißt das framing.

Die Idee wäre, Ihren Kalender als ein JSON-LD-Dokument zu beschreiben, das so gerahmt werden kann, dass es entweder SchemaA oder SchemaB entspricht. Um es anders auszudrücken, das JSON-LD-Dokument ist der Kontext, der benötigt wird, um die Mehrdeutigkeiten zwischen den Schemas zu entfernen. Ich würde ein Beispiel zeigen, aber ich kenne JSON-LD nicht so gut. Ich überlasse es dir, es zu untersuchen, wenn du denkst, es könnte dein Problem lösen.

+0

Vielen Dank @jason, fügte nur weitere Informationen zu der Frage hinzu, um klarzustellen, dass natürlich die Beziehungen zwischen den Schemas zur Verfügung gestellt werden müssen. JSON-LD scheint interessant. Können Sie bitte ein Beispiel dafür geben, wie Sie dies mit JSON-LD mithilfe des Framing-Ansatzes tun können? Vielen Dank. – user6614015

1

Ich glaube, eine Bibliothek wie this könnte verwendet werden, um Ihre Frage zu beantworten. sich die Frage nicht direkt adressieren (Umwandlung von einem JSON Schema zum anderen), aber was Sie tun können (das ist, was ich derzeit tue) ist die folgende:

  1. ein JSON-Schema für Ihre Eingabe angeben
  2. Geben Sie ein JSON-Schema für Ihre Ausgabe an
  3. Geben Sie eine Zuordnungsvorlage an (z. B. mithilfe der Bibliothek, auf die ich verwiesen habe).

Natürlich, im Idealfall würden Sie nicht beide 2 zu tun haben und 3 aber ich habe nicht etwas gefunden, die dies automatisch tut. So könnten Sie zum Beispiel die Zuordnungsvorlage angeben und eine Bibliotheksfunktion erstellen, die dieses sowie das JSON-Schema in 1 als Eingaben verwendet und das JSON-Schema in 3 als Ausgabe generiert.

Dies ist jedoch nicht trivial, so dass ich derzeit sowohl 2 und 3 angeben.

Denken Sie auch daran, dass Sie 1 und 2 nicht haben können und irgendwie automatisch generieren 3.Dies liegt daran, dass mehrere Zuordnungsfunktionen vorhanden sind, die Daten gemäß Schema 1 aufnehmen und Daten gemäß Schema 2 erstellen.