2014-12-21 4 views
3

Я хотел бы сохранить сложное дерево объектов в виде строки, которая может работать в браузере или в узлах. Самое очевидное, что нужно использовать JSON.stringify и JSON.parse - однако я просто получаю значения строк и чисел и т. Д., Но какой объект был сохранен, не сохраняется и поэтому не может быть восстановлен. Вернее, значения восстанавливаются, но не привязываются к функциям. Каким будет правильный способ сохранения объектов, имеющих функции метода в JavaScript?Как перенести сложные объекты как строки в javascript

+0

В идеале вы отделяете данные от поведения и сохраняете данные как JSON и предоставляете своим классам возможность инициализировать себя из этих данных. – Tomalak

+0

Что сказал @Tomalak; но, кроме того, какие функции привязки вы спрашиваете? – Vince

+0

@Vince - это просто общие функции манипуляции и преобразования данных, позволяющие выполнять определенные виды операций с данными. – nwaltham

ответ

1

Вы уже можете делать то, что вы хотите с JSON.stringify() и JSON.parse().

JSON.stringify() проверяет метод .toJSON() на объекты, которые вы передаете ему. Поэтому, если ваш объект/класс/независимо от того, что реализует этот метод, вы можете вернуть любой нужный серийный формат. Это может включать тип объекта/класса и другую информацию, необходимую для его последующего повторного инициализации.

JSON.parse() имеет reviver function parameter, что позволяет вручную возвращать нетериализованное значение для каждого разобранного значения JSON.

Так, например, в вашем .toJSON() вы можете вернуть объект, содержащий ваши данные, а также свойство __objType, которое задает имя типа объекта. Затем в вашей функции reviver вы проверяете, является ли это значение объектом, и имеет ли он свойство __objType. Если это так, то вы проверяете значение этого свойства и несериализуете его соответствующим образом (вы даже можете записать .fromJSON() в свой объект/класс, который сделает это за вас, но в отличие от .toJSON(), .fromJSON() не имеет особого значения).

1

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

Возможно, вам необходимо создать функцию exportToJson и функцию importFromJson, например.

function SomeClass(json) { 
    var base = this; 


    base.a = 'asdf'; 
    base.b = 'fdsa'; 

    base.export = function() { 
     return JSON.stringify({ 
      a: base.a, 
      b: base.b 
     }); 
    }; 
    base.imports = function (js) { 
     base.a = js['a']; 
     base.b = js['b']; 
    }; 

    if (typeof json !== 'undefined') { 
     base.imports(json); 
    } 
} 

(не самое элегантное решение, но это также StackOverflow: р)

Смежные вопросы