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()
.
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));
행운을 빕니다!
편집: typeof를 올바른 .constructor로 변경했습니다. 개체의 생성자 속성에 대한 자세한 내용 은 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;
//}
정규식을 사용하여 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');*/ });
위의 솔루션을 "연관 배열" 유형 개체와 함께 사용하는 데 몇 가지 문제가 있었습니다. 이러한 솔루션은 값을 보존하는 것처럼 보이지만 해당 값이 연결된 개체의 실제 이름을 보존하지 않으므로 일부 문제가 발생할 수 있습니다. 그래서 대신 사용하고 있는 다음 기능을 정리했습니다.
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));
ReferenceURL : https://stackoverflow.com/questions/8164802/serialize-javascript-object-into-json-string
'IT이야기' 카테고리의 다른 글
파일이 Python에서 열려 있는지 확인 (0) | 2021.09.21 |
---|---|
추상은 아니지만 재정의해야 하는 메서드를 만드는 방법 (0) | 2021.09.18 |
면도기 보기 내부에서 내 모델이 유효한지 어떻게 확인할 수 있습니까? (0) | 2021.09.18 |
정적 가상 기능을 가질 수 있습니까? (0) | 2021.09.17 |
파이썬에서 "컨테이너"란 정확히 무엇입니까? (0) | 2021.09.17 |