将JavaScript窗口对象转换为JSON
问题描述:
很明显,这看起来似乎起初不能完成,但我会清楚地说明,我已成功将JavaScript窗口对象转换为JSON。我需要帮助的是如何以比我现在正在做的更聪明的方式来做到这一点。将JavaScript窗口对象转换为JSON
的方法的工作原理,现在是这样的:
1)创建一个新对象,并从窗口键每个键被复制到新的对象。常用密钥的列表不会被添加到新对象(例如WebSocket)。 2)一个名为getArray的函数递归地清理每个子对象并将其保存为JSON。结果如下所示{'key':'JSON _ {....}'}或{'key':'JSON _ {{'key':'JSON _ {....}'}}'}。这个想法是在最小的级别捕获错误,以便最终的JSON对象由键组成:JSON_string值。另一个关键点是捕捉圆形物体。如果该对象有任何一长串键,则将其排除(例如,tagName)。
问题是这段代码有点不稳定。它刚刚停止在我们的网站上工作,我不想改进它。
我会接受任何将窗口对象转换为JSON(或任何可以正确解码的文本格式)的解决方案。如果可能的话,我建议部分解决方案是一种能够检测出循环和非JSON可编码对象100%的功能。这将需要一个天才,但我相信这是可能的。
这样做的目的是用户发送的错误报告来显示我们的JavaScript的状态。枚举1的对象太多了,1,甚至我们的用户创建的对象都包含一个不可编码的对象。这对网络非常有用和相关。
这里是当前的代码,所描述的设计模式。 getWindow()
getWindow: function()
{
var obj2 = {};
for (var i in window)
{
obj2[i] = 1;
}
var keys = ["RequestLogs", "WebSocket", "ClickLogs", "$", "jQuery", "window", "top", "location", "external", "chrome", "document", "i", "arr", "webkitNotifications", "localStorage", "sessionStorage", "applicationCache", "webkitStorageInfo", "indexedDB", "webkitIndexedDB", "crypto", "CSS", "performance", "console", "devicePixelRatio", "styleMedia", "parent", "opener", "frames", "self", "defaultstatus", "defaultStatus", "status", "name", "length", "closed", "pageYOffset", "pageXOffset", "scrollY", "scrollX", "screenTop", "screenLeft", "screenY", "screenX", "innerWidth", "innerHeight", "outerWidth", "outerHeight", "offscreenBuffering", "frameElement", "clientInformation", "navigator", "toolbar", "statusbar", "scrollbars", "personalbar", "menubar", "locationbar", "history", "screen", "postMessage", "close", "blur", "focus", "ondeviceorientation", "ondevicemotion", "onunload", "onstorage", "onresize", "onpopstate", "onpageshow", "onpagehide", "ononline", "onoffline", "onmessage", "onhashchange", "onbeforeunload", "onwaiting", "onvolumechange", "ontimeupdate", "onsuspend", "onsubmit", "onstalled", "onshow", "onselect", "onseeking", "onseeked", "onscroll", "onreset", "onratechange", "onprogress", "onplaying", "onplay", "onpause", "onmousewheel", "onmouseup", "onmouseover", "onmouseout", "onmousemove", "onmouseleave", "onmouseenter", "onmousedown", "onloadstart", "onloadedmetadata", "onloadeddata", "onload", "onkeyup", "onkeypress", "onkeydown", "oninvalid", "oninput", "onfocus", "onerror", "onended", "onemptied", "ondurationchange", "ondrop", "ondragstart", "ondragover", "ondragleave", "ondragenter", "ondragend", "ondrag", "ondblclick", "oncuechange", "oncontextmenu", "onclose", "onclick", "onchange", "oncanplaythrough", "oncanplay", "oncancel", "onblur", "onabort", "onwheel", "onwebkittransitionend", "onwebkitanimationstart", "onwebkitanimationiteration", "onwebkitanimationend", "ontransitionend", "onsearch", "getSelection", "print", "stop", "open", "showModalDialog", "alert", "confirm", "prompt", "find", "scrollBy", "scrollTo", "scroll", "moveBy", "moveTo", "resizeBy", "resizeTo", "matchMedia", "requestAnimationFrame", "cancelAnimationFrame", "webkitRequestAnimationFrame", "webkitCancelAnimationFrame", "webkitCancelRequestAnimationFrame", "captureEvents", "releaseEvents", "atob", "btoa", "setTimeout", "clearTimeout", "setInterval", "clearInterval", "TEMPORARY", "PERSISTENT", "getComputedStyle", "getMatchedCSSRules", "webkitConvertPointFromPageToNode", "webkitConvertPointFromNodeToPage", "webkitRequestFileSystem", "webkitResolveLocalFileSystemURL", "openDatabase", "addEventListener", "removeEventListener", "dispatchEvent"];
for (var iii in keys)
{
var key = keys[iii];
if (obj2[key])
delete(obj2[key]);
}
for (var i in obj2)
{
obj2[i] = window[i];
}
return this.getArray(obj2, 0);
},
的getArray()
getArray: function(obj, count)
{
try {
var data = this._getArray(obj, count);
var cache = [];
if (typeof data === 'object' && data !== null) {
if (cache.indexOf(data) !== -1) {
// Circular reference found, discard key
return 'circular';
}
// Store value in our collection
cache.push(data);
}
if (typeof data == 'object')
return 'JSON_' + JSON.stringify(data);
else
return data;
//return data;
} catch (e)
{
console.log(e);
return '';
}
}
,
_getArray
_getArray: function(obj, count)
{
count = isset(count) ? count : 0;
if (obj == window && count > 0)
return 'window';
if (obj && typeof obj == 'object')
{
if (Object.keys(obj).length >= 100 && count > 0)
{
return 'object,>100keys';
}
if (obj['tagName'])
{
return obj['tagName'];
}
if (count > 0)
{
var keys = ['$', 'tagName', 'scrollTop', 'contentEditable', 'documentURI', 'documentElement', 'context', 'selector', 'jquery', 'ATTRIBUTE_NODE', 'nodeName'];
for (var ii in keys)
{
if (obj[0] && obj[0].length == 3)
{
///log2(obj);
}
var key = keys[ii];
if (obj[key])
{
return ii;
}
}
}
if (!$.isPlainObject(obj))
{
var obj2 = {};
for (var ii in obj)
{
obj2[ii] = obj[ii];
}
obj = obj2;
}
}
var arr = {};
for (var i in obj)
{
var type = typeof obj[i];
if (type == 'string' || type == 'number' || type == 'boolean')
{
arr[i] = obj[i];
}
if (type == 'function')
{
var obj2 = {};
var funcHasData = false;
for (var ii in obj[i])
{
funcHasData = true;
obj2[ii] = obj[i][ii];
}
if (funcHasData)
{
arr[i] = obj2;
}
}
if (type == 'object')
{
if (count > 5)
{
return '_';
}
arr[i] = this.getArray(obj[i], count + 1);
}
}
return arr;
}
答
用法:GetLocalProperties(object); 或GetLocalProperties.getWindow();
GetLocalProperties = function(obj,parent_objects){
var keys = Object.getOwnPropertyNames(obj);
if (typeof parent_objects == 'object')
{
if (parent_objects.indexOf(obj) >= 0)
{
return 'recursive obj';
}
parent_objects = GetLocalProperties.copyArray(parent_objects);
} else {
parent_objects = [window];
}
//console.log(parent_objects.length);
if (parent_objects.length > 10)
{
return 'depth greater than 10';
}
parent_objects.push(obj);
var new_object = {};
for (var key_i_key in keys)
{
var key_i = keys[key_i_key];
var value_i = obj[key_i];
var value_cloned = GetLocalProperties.getKeyValue(value_i,parent_objects);
new_object[key_i] = value_cloned;
}
return new_object;
};
GetLocalProperties.getKeyValue = function (value_i,parent_objects)
{
GetLocalProperties.last_value_i = value_i;
GetLocalProperties.last_parent_objects = parent_objects;
var type = typeof value_i;
switch (type)
{
case 'object':
if (!value_i)
{
return 'value_is_null';
}
if (Array.isArray(value_i))
{
//return value_i;
}
return GetLocalProperties(value_i,parent_objects);
case 'boolean':
case 'number':
case 'string':
return value_i;
}
return 'not_copied';
};
GetLocalProperties.copyArray = function(arr)
{
var arr_new = [];
for (var i in arr)
{
arr_new.push(arr[i]);
}
return arr_new;
};
GetLocalProperties.getWindow = function()
{
return GetLocalProperties.getObjectClean(window);
};
GetLocalProperties.getObjectClean = function(obj)
{
var a = GetLocalProperties(obj);
for (var i in a)
{
var value_i = a[i];
if (typeof value_i == 'string' && value_i == 'not_copied')
{
delete(a[i]);
}
}
return a;
};
.....但是为什么,OP? – AlienWebguy
或日期或RegExps或元素,或nativeCode或链接的参考或关闭,或者......您的代码不应该使全局变量,所以为什么需要遍历全局? – dandavis
Mozilla的['toSource()'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toSource)很有用,但是Object.prototype.toSource.toSource ()'不会给你你需要的代码。 – Pluto