42

JavaScriptオブジェクトをDBに格納するには、JavaScriptオブジェクトをシリアル化および逆シリアル化する必要があります。

これらのオブジェクトには関数が含まれているため、JSONとして保存できないため、json2.jsを使用できないことに注意してください。

JavaScriptオブジェクトの[逆]シリアル化(もちろんJavaScriptで)の最先端は何ですか。

4

6 に答える 6

31

一般に、(ブラウザでは)関数がアタッチされたオブジェクトをシリアル化する方法はありません。すべての関数には外部スコープへの参照があり、逆シリアル化するとそのスコープは存在しないため、そのスコープへのシリアル化された参照は無効になります。 。

私がすることは、組み込み(またはjson2.js)JSON.stringifyJSON.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(latitude、longitude)」形式は、それを行う1つの方法にすぎません。JSONにネイティブにシリアル化できるJavaScriptオブジェクトを返すこともできます。

于 2010-08-31T13:21:49.447 に答える
9

関数などのロジックをシリアル化する必要はありません。

将来、ロジック/ js関数を更新する必要がある場合は、(常に)古いロジックにデータを再ロードする必要はありません。注意してください。

于 2013-09-27T18:21:31.643 に答える
7

gserializerを使用します:

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

グーグルのコード:

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

GSerializerは、JavaScriptオブジェクトを文字列との間でシリアル化/逆シリアル化するためのjavascriptライブラリであり、Cookieなどの永続性を実現します。他の多くの実装とは異なり、GSerializerは関数と非JSON表記をシリアル化することもできます。

于 2010-08-31T11:33:56.160 に答える
2

Node.jsには、JASONパッケージもあります。

次に例を示します。

var JASON = require("JASON");

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

次の方法でパッケージをインストールしますnpm install JASON

于 2015-05-15T13:06:51.490 に答える
1

ES6バージョンのNodeを使用している場合は、私が作成した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
于 2017-07-15T02:51:06.277 に答える
0

セキュリティ上の理由から、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());
于 2015-09-06T22:32:49.500 に答える