javascript - 이란 - 자바 직렬화 통신
순환 객체 값을 포함하는 객체 직렬화 (4)
GitHub Gist를 만들었습니다. 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);
여기에서 예제 피들을 찾을 수 있습니다.
다른 노드에 대한 참조 인 자식 노드가 포함 된 개체 (구문 분석 트리)가 있습니다.
JSON.stringify()
사용하여이 객체를 직렬화하고 싶습니다. 그러나 다음과 같습니다. TypeError: cyclic object value
.
이 문제를 어떻게 해결할 수 있습니까? 다른 노드에 대한 이러한 참조가 직렬화 된 객체에 표시되는지 여부는 중요하지 않습니다.
반면에 객체가 생성 될 때 객체에서 이러한 속성을 제거하는 것은 지루하고 난 파서 (수선)를 변경하고 싶지 않습니다.
이미 serialize 된 객체를 제외하려면 replacer 함수 인 stringify
의 두 번째 매개 변수를 사용하십시오.
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 가 더 나은 선택입니다.
훨씬 많은 세이버와 사이클 오브젝트가 어디에 있는지를 보여줍니다.
<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
}
);
}
전제 조건이 없어졌습니다. 그렇지 않으면 배열 객체의 정수 값이 잘립니다. 즉 [[08.11.2014 12:30:13, 1095]] 1095가 095로 축소됩니다.