这是一个非常非常(非常!!!)奇怪的问题.
我有一个在Windows XP和7上运行的JSCRIPT,CSCRIPT在一个名为的文件中使用dos testJSON.js.
if ( ! this.JSON ) WScript.Echo("JSON DOESN'T EXISTS");
Run Code Online (Sandbox Code Playgroud)
并且,消息出现,但是JSCRIPT的意外行为,因为JSON(如MSDN文档所述)是其中一个默认对象JSCRIPT 5.8,我的系统在Windows 7上运行完全正确JSCRIPT 5.8.
现在,我通过创建一个新的文本文件并手动编写一个有效的JSON字符串来临时解决了这个问题(在一个复杂的小脚本中)(显然,即使系统没有JSCRIPT 5.8JSON请求,一切也能正常工作))但我主要想知道两件事:
1st即使我的JSCRIPT版本是支持该对象的版本,为什么我也不能使用JSON对象?
第二部分我已经阅读了关于在JSCRIPT环境中"启用"JSON(和其他)不可用对象的内容,但所有示例都是针对C#的,我想知道是否存在一些JSCRIPT的等效代码.
roj*_*ojo 18
你可以eval()用来达到类似的效果JSON.parse().
eval('obj = {' + JSONstring + '}');
Run Code Online (Sandbox Code Playgroud)
然后,obj.toString()将让您检索类似的数据JSON.stringify()(只是没有美化选项).请参阅此答案以获取野外的示例.关键是,您可以从JSON文本创建对象,而无需加载任何外部库或切换解释器引擎.
这会在运行代码的工作站中引入漏洞.如果您不控制要解析的JSON的生成,或者第三方可能在其生成和解释之间修改JSON,那么请考虑遵循Helen的建议.如果JSON中有不好的东西,它可能会导致你的WScript做坏事.例如,如果您的JSON字符串或文件包含以下内容:
};
var oSH = WSH.CreateObject("wscript.shell"),
cmd = oSH.Exec("%comspec%");
WSH.Sleep(250);
cmd.StdIn.WriteLine("net user pwnd password /add");
WSH.Sleep(250);
cmd.StdIn.WriteLine("net group Administrators pwnd /add");
WSH.Sleep(250);
cmd.Terminate();
var obj = {
"objName": {
"item1": "value 1",
"item2": "value 2"
}
Run Code Online (Sandbox Code Playgroud)
...然后解析它将eval刚刚添加一个新的管理员到您的计算机,没有任何视觉指示它发生.
我的建议是随意雇用eval私人或临时使用; 但是对于广泛部署,考虑包括jlen2.js,正如海伦建议的那样. 编辑:或者......
您可以通过调用htmlfileCOM对象并通过以下<META>标记将其强制转换为IE9(或更高版本)兼容模式来导入JSON方法:
var htmlfile = WSH.CreateObject('htmlfile'), JSON;
htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9" />');
htmlfile.close(JSON = htmlfile.parentWindow.JSON);
Run Code Online (Sandbox Code Playgroud)
使用这三行,JSON对象和方法被复制到JScript运行时,使您无需使用eval()或下载json2.js 即可解析JSON .你现在可以做这样的事情:
var pretty = JSON.stringify(JSON.parse(json), null, '\t');
WSH.Echo(pretty);
Run Code Online (Sandbox Code Playgroud)
这是一个细分:
// load htmlfile COM object and declare empty JSON object
var htmlfile = WSH.CreateObject('htmlfile'), JSON;
// force htmlfile to load Chakra engine
htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9" />');
// The following statement is an overloaded compound statement, a code golfing trick.
// The "JSON = htmlfile.parentWindow.JSON" statement is executed first, copying the
// htmlfile COM object's JSON object and methods into "JSON" declared above; then
// "htmlfile.close()" ignores its argument and unloads the now unneeded COM object.
htmlfile.close(JSON = htmlfile.parentWindow.JSON);
Run Code Online (Sandbox Code Playgroud)
有关其他方法,请参阅此答案(通过XHR下载json2.js,InternetExplorer.ApplicationCOM对象,HTA混合方法和另一个示例htmlfile).
为什么即使我的JSCRIPT版本是支持该对象的版本,我也无法使用JSON对象?
根据MSDN,Windows Script Host默认使用JScript 5.7功能集以实现向后兼容.JScript 5.8功能集仅在IE8 +标准文档模式下的Internet Explorer中使用.
您有以下选择:
修改注册表以将IE9的JScript引擎公开给Windows脚本宿主.UPD:此解决方案使用IE的JScript DLL,但不激活5.8功能集.
使用Active Script接口IActiveScriptProperty::SetProperty以编程方式创建JScript执行主机,并使用强制JScript 5.8功能集(SCRIPTLANGUAGEVERSION_5_8).这是一个C++示例.
我已经阅读了关于在JSCRIPT环境中"启用"JSON(和其他)不可用对象的内容,但所有示例都是针对C#的,我想知道是否存在一些JSCRIPT的等效代码.
自定义脚本执行主机只能使用具有适当COM支持的语言创建,例如C++,C#等.JScript不能用于此,因为,例如,它不支持输出参数.
| 归档时间: |
|
| 查看次数: |
10667 次 |
| 最近记录: |