Skip to content

Commit 8f9fd5c

Browse files
committed
Introduce JSROOT.toJSON() function
Let convert any JavaScript object into ROOT JSON format, transfer via socket and parse it again with JSROOT.parse()
1 parent d5d5f1e commit 8f9fd5c

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

scripts/JSRootCore.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,50 @@
488488
return arr;
489489
}
490490

491+
/** @memberOf JSROOT
492+
* Method converts JavaScript object into ROOT-like JSON.
493+
* Produced JSON can be used in JSROOT.parse() again */
494+
JSROOT.toJSON = function(obj) {
495+
if (!obj || typeof obj !== 'object') return "";
496+
497+
var map = []; // map of stored objects
498+
499+
function copy_value(value) {
500+
if (typeof value === "function") return undefined;
501+
502+
if ((value===undefined) || (value===null) || (typeof value !== 'object')) return value;
503+
504+
var proto = Object.prototype.toString.apply(value);
505+
506+
// typed array need to be converted into normal array, otherwise looks strange
507+
if ((proto.indexOf('[object ') == 0) && (proto.indexOf('Array]') == proto.length-6)) {
508+
var arr = new Array(value.length)
509+
for (var i = 0; i < value.length; ++i)
510+
arr[i] = copy_value(value[i]);
511+
return arr;
512+
}
513+
514+
// this is how reference is code
515+
var refid = map.indexOf(value);
516+
if (refid >= 0) return { $ref: refid };
517+
518+
map.push(value);
519+
520+
var ks = Object.keys(value), len = ks.length, tgt = {}, name;
521+
522+
for (var k = 0; k < len; ++k) {
523+
name = ks[k];
524+
tgt[name] = copy_value(value[name]);
525+
}
526+
527+
return tgt;
528+
}
529+
530+
var tgt = copy_value(obj);
531+
532+
return JSON.stringify(tgt);
533+
}
534+
491535
/** @memberOf JSROOT */
492536
JSROOT.GetUrlOption = function(opt, url, dflt) {
493537
// analyzes document.URL and extracts options after '?' mark

0 commit comments

Comments
 (0)