Как сериализовать и десериализовать объекты Javascript? - PullRequest
34 голосов
/ 31 августа 2010

Мне нужно сериализовать и десериализовать объекты Javascript, чтобы хранить их в БД.

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

Каков уровень техники в сериализации [de]объектов javascript (конечно, в javascript).

Спасибо, Стюарт

Ответы [ 6 ]

27 голосов
/ 31 августа 2010

В общем случае (в браузере) нет способа сериализации объектов с прикрепленными к ним функциями, поскольку каждая функция имеет ссылку на свою внешнюю область видимости.Если функция ссылается на какую-либо из этих переменных, они больше не будут существовать, когда вы ее десериализуете.

Я бы хотел использовать встроенные (или json2.js) JSON.stringify и JSON.parse функциис параметрами replacer и reviver.Вот частичный пример того, как это будет работать:

JSON.stringify(yourObject, function(name, value) {
    if (value instanceof LatLng) { // Could also check the name if you want
        return 'LatLng(' + value.lat() + ',' + value.lng() + ')';
    }
    else if (...) {
        // Some other type that needs custom serialization
    }
    else {
        return value;
    }
});

JSON.parse(jsonString, function(name, value) {
    if (/^LatLng\(/.test(value)) { // Checking the name would be safer
        var match = /LatLng\(([^,]+),([^,]+)\)/.exec(value);
        return new LatLng(match[1], match[2]);
    }
    else if (...) {
        ...
    }
    else {
        return value;
    }
});

Вы можете использовать любой формат сериализации, который вы хотите в ваших пользовательских типов.Формат «LatLng (широта, долгота)» - это только один из способов сделать это.Вы даже можете вернуть объект javascript, который может быть сериализован в JSON.

10 голосов
/ 27 сентября 2013

Вы не хотите сериализовать логику, такую ​​как функции.

Если вам придется обновлять ваши логические / js-функции в будущем, вы не должны (всегда) хотеть, чтобы старая логика была загружена обратно с необходимостью. Осторожно.

7 голосов
/ 31 августа 2010

использовать gserializer :

http://www.onegeek.com.au/articles/programming/javascript-serialization.php

код в Google:

http://code.google.com/p/gserializer/

GSerializer - это библиотека javascript для сериализации / десериализации объектов javascript в и из строк, например, для сохранения в Cookie.В отличие от многих других реализаций, GSerializer также может сериализовать функции и нотации не-JSON.

1 голос
/ 15 июля 2017

Если вы используете версии Node для ES6, вы можете проверить небольшой пакет, который я написал, под названием JSOFF . Это объектно-функциональный формат JavaScript; вставная замена для JSON, который обрабатывает функции.

Это супер крошечный и простой, так что Babeljs или Browserify могут быть вашими друзьями.

Установка через: npm install jsoff или yarn add jsoff.

Вот пример того, как создать объект с функциями:

const JSOFF  = require('jsoff');

var obj = {
  abc: 123,
  def: function (a,b) { return a * 2 + b * 3; },
  ghi: a => { return a * 2 },
  jkl: (a,b) => { return ((d,e) => { return a*d + b*e })(2,4) }
};

var str = JSOFF.stringify(obj);
// str is now:  
// '{"abc":123,"def":"function (a,b) { return a * 2 + b * 3; }","ghi":"a => { return a * 2 }","jkl":"(a,b) => { return ((d,e) => { return a*d + b*e })(2,4) }"}');
});

var clone = JSOFF.parse(str);
clone.def(10,5)   // 35
clone.ghi(5)      // 10
clone.jkl(10,20)  // 100
1 голос
/ 15 мая 2015

На Node.js есть также пакет JASON .

Вот пример:

var JASON = require("JASON");

str = JASON.stringify(obj);
obj = JASON.parse(str);

Установите пакет с помощью: npm install JASON.

0 голосов
/ 07 сентября 2015

Я бы не стал сериализовать функции JS по соображениям безопасности.Через публичный API все виды неприятных вещей могут быть отправлены в базу данных.Что касается десериализации, у меня другой подход.Я смешиваю объекты модели, определенные на стороне клиента, с данными из JSON.У меня есть небольшой инструмент для этого, посмотрите на него на GitHub по адресу khayll / jsonmix .

JsonMix обеспечивает своего рода десериализацию из JSON в объекты JavaScript в комплекте с функциями.

Это будет выглядеть примерно так:

//model definition (just an example)

var LatLng = function() {}
LatLng.prototype.getMapTypeId = function() {
   return this.mapTypeId;
}

//deserializing done like this
var result = JSMix(jsonString).withObject(LatLng.prototype, "latLngs").build();

//all items in the latLngs collection have the functions coming from the model
console.log(result.latLngs[5].getMapTypeId());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...