2012-10-23 8 views
9

Gibt es irgendeine Bibliothek um JavaScript-typisiertes Objekt (JS-Funktionen) aus einem JSON-Schema zu generieren? Grundsätzlich die entsprechende JS-Version dieser http://code.google.com/p/jsonschema2pojo/. Danke.JSON-Schema zu Javascript typisiertes Objekt

EDIT:

ab:

{ 
    "description": "An entity", 
    "type":"object", 
    "properties": { 
     "geometries": {"type": "array", 
      "items": { 
       "$ref" : "geometry" 
      } 
      } 
    } 
} 

ich so etwas Code möchten für mich

function Entity { 
    this.geometries; 
} 

Offensichtlich ist das Schema mit $ ref die erzeugt werden komplexer sein könnte Ich hoffe, das gibt die Idee.

+0

JSON ist gültig Javascript, Sie wissen. –

+0

Bitte poste etwas Code. –

+1

Willkommen bei Stack Overflow. Sie können den Quellcode mit der Symbolleistenschaltfläche '{}' formatieren. Ich habe es diesmal für dich getan. –

Antwort

-1

Das einzige, was Sie tun könnten, ist eine -Eigenschaft zu Ihren JSON-Objekten hinzufügen (nennen Sie es auf eine seltsame Weise, damit es nicht mit anderen Literalen kollidiert), die Ihren Typ identifizieren. Sie könnten diese Zeichenfolge dann einem anderen Objekt in JavaScript zuordnen, das die verfügbaren Eigenschaften auflistet.

Sie könnten dies tun - es bedeutet nicht, dass es eine gute Idee ist. Json wird direkt in Javascript verwendet.

0

Ich würde sagen, Sie sind auf sich allein gestellt. Wie auch immer, es sollte nicht zu schwierig sein. Parsen Sie einfach den JSON, den Sie haben, und durchlaufen Sie dann jedes Element, wenden Sie die gewünschte Logik für jede "Klasse" an und hängen Sie das Ergebnis an eine Zeichenkette an. Wenn Sie fertig sind, drucken Sie diese Zeichenfolge und verwenden Sie einen beliebigen JS-Formatierer, um Ihren Code zu erhalten.

+1

Danke, war nur daran interessiert, ob da draußen schon was war. Nicht einmal sicher, dass es eine gute Idee ist, mit diesen Objekten statt mit JSON-Objekten selbst zu arbeiten. – Tarelli

+0

Das hängt davon ab, was genau du versuchst. Ich erinnere mich, dass ich etwas Ähnliches für C# gesehen habe, aber nicht sicher wo, also solltest du Google vielleicht einen Versuch geben. – alexandernst

2

Deckt diese Bibliothek djvi Ihre Anforderungen?

Das bereitgestellte Beispiel zeigt:

var jsonSchema = {"common":{"properties":{"type":{"enum":["common"]}},"required":["type"]}}; 

var env = new djvi(); 
env.addSchema('test', jsonSchema); 
env.instance('test#/common'); 
// => { type: 'common' } 

Ich vermute, dass die Lösung Sie nach.

Nun ist diese nicht die genaue Lösung ist Sie nach, aber ich hatte ein ähnliches Problem und erstellt die folgende Lösung ein übergeordnetes Objekt als Funktion zurückzukehren, es helfen kann:

var dbdict = { 
    "title": "Entity", 
    "description": "An entity", 
    "type":"object", 
    "properties": { 
     "geometries": {"type": "array", 
      "items": { 
       "$ref" : "geometry" 
      } 
      } 
    } 
} 

var walkJSONSchema = function (JSONSchema, returnFunction) { 

    var walkObject = function(PROPS) { 
     var $this = this, 
      $child = {} 
     ; 

     if(returnFunction == true) { 
      $child = new function() {}; 
     } 

     //console.log("PROPS"); 
     //console.log(PROPS); 

     for(var key in PROPS) { 
      console.log("key:"+key+" type:"+PROPS[key].type+" default:"+PROPS[key].default); 
      switch(PROPS[key].type) { 
       case "boolean": 
        $child[key] = PROPS[key].default || undefined; 
        break; 
       case "integer": 
       case "number": 
        $child[key] = PROPS[key].default || undefined; 
        break; 
       case "array": 
        $child[key] = [].push($this.walkObject(PROPS[key].properties)); 
        break; 
       case "object": 
        $child[key] = $this.walkObject(PROPS[key].properties); 
        break; 
       case "string": 
        $child[key] = PROPS[key].default || undefined; 
        break; 
      }; 
     }; 

     return $child; 
    } 

    return walkObject(JSONSchema.properties); 
} 

Entity = walkJSONSchema(dbdict, true); 

Natürlich könnten Sie Skript den Abruf der "Entity" aus dem Schema doc wie Sie möchten, aber auf diese Weise erhalten Sie zumindest eine Funktion.