2014-01-02 4 views
1

Я понимаю, что JSON предназначен для обмена информацией. Что меня смущает, я хотел бы иметь возможность использовать JSON для хранения и вызова объектов и их конструкторов, если это возможно, но поскольку JSON - это буквальная запись, мне было интересно, есть ли способ заполнить параметры объекта JSON каким-то типом конструктор очень похож на способ работы нормального конструктора.Можете ли вы создать конструктор JSON?

Ближе всего я нашел это:

Нормальный Constructor:

var dude = function(name, age) { 
this.name = name; 
this.age = age; 
} 
var bro = new dude("chad", 22); 

JSON:

var bro = { 
'name': "chad", 
'age': 22 
}; 

Но даже это не совсем то же самое, учитывая с конструктором вы можете позвонить var bro2 = new dude("tony", 21); в любое время и получить новый экземпляр dude всякий раз, когда захотите. Как вы могли бы сохранить этот тип функциональности с JSON, брошенным в микс?

+0

JSON это формат главным образом строк, так что ваш вопрос не так легко понять, как вы могли бы подумать, вы на самом деле говорите о только регулярном яваскрипте объектов? – adeneo

+0

Да, но вы также можете хранить сложные объекты в JSON. – ryanhagz

+2

То, что вы вызываете JSON во втором примере кода, не является JSON. Это создание объекта с использованием буквенного синтаксиса JavaScript. JSON - это портативная, не зависящая от платформы система сериализации данных, которая использует подмножество синтаксиса литерала JavaScript. – JAAulde

ответ

2

У вас есть большое заблуждение относительно того, что такое JSON.

Этот

var bro = { 
    'name': "chad", 
    'age': 22 
}; 

является Java-оператор присваивания с объектом буквального. Это НЕ JSON, однако JSON представление bro объекта будет выглядеть удивительно похожи:

{ "name":"chad","age":22} 

до лапок и пространств.

Так реального экземпляра объекта из JSON в JavaScript будет

var bro = JSON.parse('{ "name":"chad","age":22}') 

Для того, чтобы лучше понять, что происходит прочитать this MDN article и этот старый John Resig's article на простое наследование. Скорее всего, он ответит на ваш вопрос.

0

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

var dude = function(name, age) { 
    this.name = name; 
    this.age = age; 
} 

var bro = { 
    "name": "Chad", 
    "age": 22 
}; 

var thatGuy = new dude(bro.name, bro.age); 

Если нет, то я в полной потери.

+0

Я действительно думаю, что вы неверно истолковали вопрос, как вы уже догадались. Кроме того, ваш ответ не использует JSON. ОП имеет неправильное представление о том, что такое JSON, с которым вы, похоже, делитесь. – JAAulde

+0

Я бы предположил, что переменная 'bro' просто иллюстрирует пример и не предназначена для JSON строго говоря, а является результатом объекта JSON. И, во всех правах, '{" name ":" Chad "," age ": 22}' is JSON, однако я испортил кавычки (все еще придерживаясь строгих правил PHP). –

+1

Ну, нет, не во всех прав. Нет, если это не строка. При использовании синтаксиса JS literal для создания объектов вам даже не нужны кавычки. Я знаю, что это похоже на игру семантики, но на самом деле это очень важное различие для кодера, который хочет понять, с чем они работают в любой момент времени. Тем не менее, я буду молчать. :) – JAAulde

0

JSON - очень ограниченное подмножество JavaScript и может содержать только данные, а не исполняемый код. Если вы хотите выполнить код для каждого объекта определенных типов, вам придется управлять этим самостоятельно.

Одним из решений является дать каждому JSON объект с type свойством:

// JSON data: 
[{"type":"Book", "title"="Of Mice And Men", "author": { "type":"Dude", "name"="John Steinbeck" }}, ...] 

и определение «Конструктор» функции для каждого типа:

var constructorsMap = {}; 
constructorsMap[ "Book" ] = function(o){ /* Book constructor code */ } 
constructorsMap[ "Dude" ] = function(o){ /* Dude constructor code */ } 

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

var books = JSON.parse(data);// the book data above 
applyConstructor(books); 

Где applyConstructor определяются что-то вроде:

function applyConstructor(o) 
{ 
    for(var p in o) 
    { 
    if(typeof o[p] == "object") 
    { 
     applyConstructor(o[p]); 
    } 
    if(o.hasOwnProperty("type")) 
    { 
     if(typeof constructorsMap[o.type] == "function") 
     { 
      constructorsMap[ o.type ].call(o, constructorsMap[o.type]); 
     } 
    } 
    } 
} 
Смежные вопросы