2013-08-11 3 views
0

Есть ли способ создания конструкторов объектов из схемы JSON? Я хочу создать json-схему, связанную с пространством имен моего приложения, которое я могу редактировать один раз, и изменить свойства (перед временем выполнения) моих объектов.конструктор из json schema

Я знаю, что вы можете написать псевдо классический конструктор объекта как

var Note = function(input){ 
    var title = input 
}; 
var newNote = new Note("test title"); 

Можно ли создать подобную структуру с JSON? Такое, что я могу написать:

var Note = { 
    "title":"" 
}; 
var newNote = new Note(); 
newNote.title = "test title" 

Я понимаю, что это выше синтаксически неправильно, но я хотел бы иметь, например:

var notes = { 
    "NotesList":[{ 
    "title":"note1", 
    "content":"test content" 
    }] 
} 
var newNote = new Note(); 
notes.NotesList.add(newNote); 
newNote.title = "new title"; 

так, что я могу основывать все свои объекты и все их дети от этого шаблона объекта, созданные из моей схемы json. Если это невозможно, можете ли вы рекомендовать лучший метод?

+0

Это не JSON, не говоря уже о схеме JSON, это всего лишь код Javascript. Поэтому, например, цитаты не нужны. И ваш код работает так же, как если бы вы изменили '.add' на' .push' – Esailija

+0

Настоящая цель третьего примера - прочитать json из файла схемы и создать класс из этого. – aclave1

+0

Почему вы не можете просто использовать разобранный JSON напрямую? Нет необходимости иметь классы за объектами, которые имеют только данные или списки. – Esailija

ответ

0

Я нашел ответ на то, что искал. Моя конечная цель состояла в том, чтобы сделать объект с массивами детей, каждый из которых может иметь детей и т.д. Объект будет затем использоваться в качестве пространства имен для всей моего приложения, как:

var myobj = {}; 

Я хотел использовать JSON, чтобы указать свойства этого объекта, а затем построить конструкторы от этих свойств, как:

var myObj = { 
"name": "genericname", 
"id": "uniqueid", 
"children": [ 
    { 
     "grandchildren": [ 
      { 
       "name": "child", 
       "age": "0" 
      } 
     ] 
    } 
] 
}; 

то, что я в конечном итоге делаю был, построение функции конструкторы из этого, а затем клонировать их в свои новые объекты, чтобы они могли иметь это по умолчанию такие значения:

myObj.Child = function(){ 
    var child = myObj.children[0]; 
    return child; 
    //this is the unmodified constructor child 
}; 
var myObj.createChild = function(){ 
    var newChild = new Clone(myObj.Child()); 
    //do stuff to this is new child which can be modified without changing the original 
    return newChild; 
}; 
1

Я не уверен, что полностью понял ваш вопрос. Однако, если вы хотите преобразовать функцию в JSON, то да, это определенно возможно.

Все, что вам нужно сделать, это использовать парсер JavaScript, например acorn, который использует Mozilla Parser API для генерации abstract syntax tree вашего конструктора в формате JSON. Например:

var ast = acorn.parse(Note); 
var json = JSON.stringify(ast, null, 4); 
alert(json); 

function Note(input) { 
    var title = input; 
} 

См. Демонстрационную версию here. Приведенный выше код производит следующий вывод:

{ 
    "type": "Program", 
    "start": 0, 
    "end": 47, 
    "body": [ 
     { 
      "type": "FunctionDeclaration", 
      "start": 0, 
      "end": 47, 
      "id": { 
       "type": "Identifier", 
       "start": 9, 
       "end": 13, 
       "name": "Note" 
      }, 
      "params": [ 
       { 
        "type": "Identifier", 
        "start": 14, 
        "end": 19, 
        "name": "input" 
       } 
      ], 
      "body": { 
       "type": "BlockStatement", 
       "start": 21, 
       "end": 47, 
       "body": [ 
        { 
         "type": "VariableDeclaration", 
         "start": 27, 
         "end": 44, 
         "declarations": [ 
          { 
           "type": "VariableDeclarator", 
           "start": 31, 
           "end": 44, 
           "id": { 
            "type": "Identifier", 
            "start": 31, 
            "end": 36, 
            "name": "title" 
           }, 
           "init": { 
            "type": "Identifier", 
            "start": 39, 
            "end": 44, 
            "name": "input" 
           } 
          } 
         ], 
         "kind": "var" 
        } 
       ] 
      } 
     } 
    ] 
} 

Вы можете сохранить выше AST в файле JSON и загрузить его как и в случае необходимости. Вы можете использовать escodegen преобразовать AST обратно в JavaScript следующим образом:

alert(escodegen.generate(ast)); 

Смотреть демо here. Затем вы можете создать eval сгенерированный код и использовать конструктор Note, как вы пожелаете.