순환 객체 값을 포함하는 직렬화 객체
다른 노드에 대한 참조 인 하위 노드가 포함 된 객체 (구문 트리)가 있습니다.
을 사용 하여이 객체를 직렬화하고 싶지만 언급 한 구성 때문에 JSON.stringify()
:TypeError: cyclic object value
이 문제를 어떻게 해결할 수 있습니까? 다른 노드에 대한 이러한 참조가 직렬화 된 오브젝트에 표시되는지 여부는 중요하지 않습니다.
반면에 객체를 만들 때 객체에서 이러한 속성을 제거하는 것은 지루한 것처럼 보이고 파서 (수선화)를 변경하고 싶지 않습니다.
이미 직렬화 된 객체를 제외 시키 stringify
려면 replacer 함수 의 두 번째 매개 변수를 사용하십시오 .
var seen = [];
JSON.stringify(obj, function(key, val) {
if (val != null && typeof val == "object") {
if (seen.indexOf(val) >= 0) {
return;
}
seen.push(val);
}
return val;
});
다른 주석에서 올바르게 지적했듯이이 코드는 "재귀 적"객체뿐만 아니라 모든 "본"객체를 제거합니다.
예를 들면 다음과 같습니다.
a = {x:1};
obj = [a, a];
결과가 올바르지 않습니다. 구조가 이와 같으면 Crockford의 decycle 또는 재귀 참조를 null로 대체하는이 (간단한) 함수 를 사용할 수 있습니다 .
function decycle(obj, stack = []) {
if (!obj || typeof obj !== 'object')
return obj;
if (stack.includes(obj))
return null;
let s = stack.concat([obj]);
return Array.isArray(obj)
? obj.map(x => decycle(x, s))
: Object.fromEntries(
Object.entries(obj)
.map(([k, v]) => [k, decycle(v, s)]));
}
//
let a = {b: [1, 2, 3]}
a.b.push(a);
console.log(JSON.stringify(decycle(a)))
순환 구조를 감지하고 해독 및 인코딩 할 수있는 GitHub Gist를 만들었습니다 : https://gist.github.com/Hoff97/9842228
변환하려면 JSONE.stringify / JSONE.parse를 사용하십시오. 또한 함수를 해독하고 인코딩합니다. 이것을 사용하지 않으려면 32-48 및 61-85 행을 제거하십시오.
var strg = JSONE.stringify(cyclicObject);
var cycObject = JSONE.parse(strg);
여기에서 바이올린 예제를 찾을 수 있습니다.
http://jsfiddle.net/hoff97/7UYd4/
어디서 많이 보호기 그것은 보여 주기 객체가 있었다.
<script>
var jsonify=function(o){
var seen=[];
var jso=JSON.stringify(o, function(k,v){
if (typeof v =='object') {
if ( !seen.indexOf(v) ) { return '__cycle__'; }
seen.push(v);
} return v;
});
return jso;
};
var obj={
g:{
d:[2,5],
j:2
},
e:10
};
obj.someloopshere = [
obj.g,
obj,
{ a: [ obj.e, obj ] }
];
console.log('jsonify=',jsonify(obj));
</script>
생산
jsonify = {"g":{"d":[2,5],"j":2},"e":10,"someloopshere":[{"d":[2,5],"j":2},"__cycle__",{"a":[10,"__cycle__"]}]}
function stringifyObject ( obj ) {
if ( _.isArray( obj ) || !_.isObject( obj ) ) {
return obj.toString()
}
var seen = [];
return JSON.stringify(
obj,
function( key, val ) {
if (val != null && typeof val == "object") {
if ( seen.indexOf( val ) >= 0 )
return
seen.push( val )
}
return val
}
);
}
A precondition was missing, otherwise the integer values in array objects are truncated, i.e. [[ 08.11.2014 12:30:13, 1095 ]] 1095 gets reduced to 095.
I create too a github project that can serialize cyclic object and restore the class if you save it in the serializename attribute like a String
var d={}
var a = {b:25,c:6,enfant:d};
d.papa=a;
var b = serializeObjet(a);
assert.equal( b, "{0:{b:25,c:6,enfant:'tab[1]'},1:{papa:'tab[0]'}}" );
var retCaseDep = parseChaine(b)
assert.equal( retCaseDep.b, 25 );
assert.equal( retCaseDep.enfant.papa, retCaseDep );
https://github.com/bormat/serializeStringifyParseCyclicObject
Edit: I have transform my script for NPM https://github.com/bormat/borto_circular_serialize and I have change function names from french to english.
참고URL : https://stackoverflow.com/questions/9382167/serializing-object-that-contains-cyclic-object-value
'development' 카테고리의 다른 글
Objective-C에서 nullable, __nullable 및 _Nullable의 차이점 (0) | 2020.06.21 |
---|---|
java.lang.UnsupportedClassVersionError : .class 파일의 버전 번호가 잘못 되었습니까? (0) | 2020.06.21 |
정규식으로 팬더의 행을 필터링하는 방법 (0) | 2020.06.21 |
'str'오브젝트에는 'decode'속성이 없습니다. (0) | 2020.06.21 |
Internet Explorer는 pushState 및 replaceState를 지원합니까? (0) | 2020.06.21 |