@@ -84,7 +84,6 @@ JsonEx._cleanMetadata = function(object){
84
84
85
85
delete object [ '@' ] ;
86
86
delete object [ '@c' ] ;
87
- delete object [ '@m' ] ;
88
87
89
88
if ( typeof object === 'object' ) {
90
89
Object . keys ( object ) . forEach ( function ( key ) {
@@ -125,21 +124,30 @@ JsonEx._encode = function(value, circular, depth) {
125
124
}
126
125
var type = Object . prototype . toString . call ( value ) ;
127
126
if ( type === '[object Object]' || type === '[object Array]' ) {
128
- value [ '@m' ] = true ;
129
127
value [ '@c' ] = JsonEx . _generateId ( ) ;
128
+
130
129
var constructorName = this . _getConstructorName ( value ) ;
131
130
if ( constructorName !== 'Object' && constructorName !== 'Array' ) {
132
131
value [ '@' ] = constructorName ;
133
132
}
134
133
for ( var key in value ) {
135
- if ( value . hasOwnProperty ( key ) ) {
134
+ if ( value . hasOwnProperty ( key ) && ! key . match ( / ^ @ . / ) ) {
136
135
if ( value [ key ] && typeof value [ key ] === 'object' ) {
137
- if ( ! value [ key ] [ '@m' ] ) {
138
- value [ key ] = this . _encode ( value [ key ] , circular , depth + 1 ) ;
139
- delete value [ key ] [ '@m' ] ;
140
- } else {
136
+ if ( value [ key ] [ '@c' ] ) {
141
137
circular . push ( [ key , value , value [ key ] ] ) ;
142
138
value [ key ] = { '@r' : value [ key ] [ '@c' ] } ;
139
+ } else {
140
+ value [ key ] = this . _encode ( value [ key ] , circular , depth + 1 ) ;
141
+
142
+ if ( value [ key ] instanceof Array ) {
143
+ //wrap array
144
+ circular . push ( [ key , value , value [ key ] ] ) ;
145
+
146
+ value [ key ] = {
147
+ '@c' : value [ key ] [ '@c' ] ,
148
+ '@a' : value [ key ]
149
+ } ;
150
+ }
143
151
}
144
152
} else {
145
153
value [ key ] = this . _encode ( value [ key ] , circular , depth + 1 ) ;
@@ -173,7 +181,14 @@ JsonEx._decode = function(value, circular, registry) {
173
181
}
174
182
for ( var key in value ) {
175
183
if ( value . hasOwnProperty ( key ) ) {
184
+ if ( value [ key ] && value [ key ] [ '@a' ] ) {
185
+ //object is array wrapper
186
+ var body = value [ key ] [ '@a' ] ;
187
+ body [ '@c' ] = value [ key ] [ '@c' ] ;
188
+ value [ key ] = body ;
189
+ }
176
190
if ( value [ key ] && value [ key ] [ '@r' ] ) {
191
+ //object is reference
177
192
circular . push ( [ key , value , value [ key ] [ '@r' ] ] )
178
193
}
179
194
value [ key ] = this . _decode ( value [ key ] , circular , registry ) ;
0 commit comments