web-dev-qa-db-ja.com

JavaScriptオブジェクトをJSON文字列にシリアル化します

このJavaScriptプロトタイプがあります。

Utils.MyClass1 = function(id, member) {
this.id = id;
this.member = member;
}

そして、私は新しいオブジェクトを作成します:

var myobject = new MyClass1("5678999", "text");

私が行った場合:

console.log(JSON.stringify(myobject));

結果は次のとおりです。

{"id":"5678999", "member":"text"}

ただし、次のように、オブジェクトのタイプをJSON文字列に含める必要があります。

"MyClass1": { "id":"5678999", "member":"text"} 

フレームワークなどを使用してこれを行う迅速な方法はありますか?または、クラスにtoJson()メソッドを実装し、手動で実行する必要がありますか?

52
Kalamarico
var myobject = new MyClass1("5678999", "text");
var dto = { MyClass1: myobject };
console.log(JSON.stringify(dto));

編集:

JSON.stringify は、クラスの「プロパティ」allを文字列化します。一部のみを保持する場合は、次のように個別に指定できます。

var dto = { MyClass1: {
    property1: myobject.property1,
    property2: myobject.property2
}};
66
Jakub Konecki

JSONだけですか? JSONをstringify()できます:

var obj = {
    cons: [[String, 'some', 'somemore']],
    func: function(param, param2){
        param2.some = 'bla';
    }
};

var text = JSON.stringify(obj);

そして、parse()を使用してJSONに再度解析します。

var myVar = JSON.parse(text);

オブジェクトに関数がある場合は、これを使用してシリアル化します:

function objToString(obj, ndeep) {
  switch(typeof obj){
    case "string": return '"'+obj+'"';
    case "function": return obj.name || obj.toString();
    case "object":
      var indent = Array(ndeep||1).join('\t'), isArray = Array.isArray(obj);
      return ('{['[+isArray] + Object.keys(obj).map(function(key){
           return '\n\t' + indent +(isArray?'': key + ': ' )+ objToString(obj[key], (ndeep||1)+1);
         }).join(',') + '\n' + indent + '}]'[+isArray]).replace(/[\s\t\n]+(?=(?:[^\'"]*[\'"][^\'"]*[\'"])*[^\'"]*$)/g,'');
    default: return obj.toString();
  }
}

例:

シリアライズ:

var text = objToString(obj); //To Serialize Object

結果:

"{cons:[[String,"some","somemore"]],func:function(param,param2){param2.some='bla';}}"

逆シリアル化:

Var myObj = eval('('+text+')');//To UnSerialize 

結果:

Object {cons: Array[1], func: function, spoof: function}
12
MSS

さて、要素の型は標準的にシリアル化されていないため、手動で追加する必要があります。例えば

var myobject = new MyClass1("5678999", "text");
var toJSONobject = { objectType: myobject.constructor, objectProperties: myobject };
console.log(JSON.stringify(toJSONobject));

幸運を!

編集:typeofを正しい.constructorに変更しました。オブジェクトのコンストラクタプロパティの詳細については、 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/constructor を参照してください。

2
Willem Mulder

これは役に立つかもしれません。 http://nanodeath.github.com/HydrateJS/https://github.com/nanodeath/HydrateJS

hydrate.stringifyを使用してオブジェクトをシリアル化し、hydrate.parseを使用して逆シリアル化します。

2
dips

コンストラクターで名前付き関数を使用できます。

MyClass1 = function foo(id, member) {
    this.id = id;
    this.member = member;
}

var myobject = new MyClass1("5678999", "text");

console.log( myobject.constructor );

//function foo(id, member) {
//    this.id = id;
//    this.member = member;
//}

正規表現を使用してmyobject.constructorから「foo」を解析し、それを使用して名前を取得できます。

1
Geuis
    function ArrayToObject( arr ) {
    var obj = {};
    for (var i = 0; i < arr.length; ++i){
        var name = arr[i].name;
        var value = arr[i].value;
        obj[name] = arr[i].value;
    }
    return obj;
    }

      var form_data = $('#my_form').serializeArray();
            form_data = ArrayToObject( form_data );
            form_data.action = event.target.id;
            form_data.target = event.target.dataset.event;
            console.log( form_data );
            $.post("/api/v1/control/", form_data, function( response ){
                console.log(response);
            }).done(function( response ) {
                $('#message_box').html('SUCCESS');
            })
            .fail(function(  ) { $('#message_box').html('FAIL'); })
            .always(function(  ) { /*$('#message_box').html('SUCCESS');*/ });

JSON.stringify()関数を使用してJSONデータを作成する別の方法を以下に示します

var Utils = {};
Utils.MyClass1 = function (id, member) {
    this.id = id;
    this.member = member;
}
var myobject = { MyClass1: new Utils.MyClass1("5678999", "text") };
alert(JSON.stringify(myobject));
1
Elias Hossain

「連想配列」タイプのオブジェクトで上記のソリューションを使用すると、いくつかの問題が発生していました。これらのソリューションは値を保持しているように見えますが、それらの値が関連付けられているオブジェクトの実際の名前は保持されないため、問題が発生する可能性があります。そこで、代わりに使用している次の関数をまとめました。

function flattenAssocArr(object) {
  if(typeof object == "object") {
    var keys = [];
    keys[0] = "ASSOCARR";
    keys.Push(...Object.keys(object));
    var outArr = [];
    outArr[0] = keys;
    for(var i = 1; i < keys.length; i++) {
        outArr[i] = flattenAssocArr(object[keys[i]])
    }
    return outArr;
  } else {
    return object;
  }
}

function expandAssocArr(object) {
    if(typeof object !== "object")
        return object;
    var keys = object[0];
    var newObj = new Object();
    if(keys[0] === "ASSOCARR") {
        for(var i = 1; i < keys.length; i++) {
            newObj[keys[i]] = expandAssocArr(object[i])
        }
    }
    return newObj;
}

これらは任意のオブジェクトでは使用できないことに注意してください。基本的には、新しい配列を作成し、キーを要素0として保存し、その後にデータを格納します。そのため、要素0をキーリストとして持つこれらの関数で作成されていない配列をロードしようとすると、結果は...興味深いものになります:)

私はこれを次のように使用しています:

var objAsString = JSON.stringify(flattenAssocArr(globalDataset));
var strAsObject = expandAssocArr(JSON.parse(objAsString));
0
urza9814

私はこの方法で問題を解決しました。明らかに最良の方法ではありませんが、共有するのは興味深いです。

私はjson2.jsライブラリを直接変更し(ベストプラクティスの反対...)、メソッドJSON.stringify()を変更し、オブジェクトを読み込むときにstr()関数でtypeofを最初に配置しました:

// Otherwise, iterate through all of the keys in the object.
// I have introduced speechModify variable.
var speechModify = false;
if(value.classname) {
    partial.Push('"' + value.classname + '":{');
    speechModify = true;
}

これは、クラスにclassname属性を追加するためだけです。繰り返した後、次の文を追加します。

if(speechModify)
    partial.Push("}");

// Join all of the member texts together, separated with commas,
// and wrap them in braces.

v = partial.length === 0
    ? '{}'
    : gap
        ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
        : '{' + partial.join(',') + '}';
gap = mind;

v = v.replace("{,","{");
v = v.replace(",}", "}");
0
Kalamarico

オブジェクトを文字列にシリアル化するには、JSON.stringify()を使用できます。

var json_str = JSON.stringify(obj, null, 2); 
// here obj is the Object to serialize, 
// second parameter null for replacer (Optional), 
// 2 for space(optional)

JSON.stringify() の詳細については、こちらをご覧ください。

繰り返しますが、オブジェクトへのJSON文字列はJSON.parse():を使用します

var obj = JSON.parse(json_str);
0
Gautam Rai