source

JavaScript 개체를 JSON 문자열로 직렬화

itover 2023. 3. 13. 20:24
반응형

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()수동으로 할 수 있을까요?

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

편집:

JSON.stringify 클래스의 모든 '속성'을 문자열화합니다.일부만 유지하려면 다음과 같이 개별적으로 지정할 수 있습니다.

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

그냥 JSON이야?넌 할 수 있다.stringify()JSON:

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

var text = JSON.stringify(obj);

JSON으로 다시 해석합니다.parse():

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}

요소의 유형은 표준 직렬화되지 않으므로 수동으로 추가해야 합니다.예를들면

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

행운을 빕니다.

edit: 의 유형이 올바른 .discor로 변경되었습니다.개체의 생성자 속성에 대한 자세한 내용은 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/constructor을 참조하십시오.

이것은 유용할 수 있습니다.http://nanodeath.github.com/HydrateJS/ https://github.com/nanodeath/HydrateJS

사용하다hydrate.stringify오브젝트를 시리얼화하다hydrate.parse디시리얼라이즈.

생성자에서 명명된 함수를 사용할 수 있습니다.

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;
//}

regex를 사용하여 myobject.constructor의 foo를 해석하여 이름을 얻을 수 있습니다.

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));
    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');*/ });

위의 솔루션과 "associative array" 타입의 오브젝트를 사용하는 데 문제가 있었습니다.이러한 솔루션은 값을 유지하는 것처럼 보이지만 이러한 값이 연결된 개체의 실제 이름은 보존하지 않으므로 몇 가지 문제가 발생할 수 있습니다.그래서 대신 사용하고 있는 기능은 다음과 같습니다.

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));

언급URL : https://stackoverflow.com/questions/8164802/serialize-javascript-object-into-json-string

반응형