сценария на языке JScript в JSON

это очень очень (очень!!!) странная проблема.

у меня есть этот JSCRIPT, который работает на windows XP и 7 с помощью dos CSCRIPT в файле testJSON.js.

if ( ! this.JSON ) WScript.Echo("JSON DOESN'T EXISTS");

и, ну, появляется сообщение, но это неожиданное поведение JSCRIPT, потому что JSON (как MSDN документация говорит) является одним из объектов по умолчанию в JSCRIPT 5.8 и моя система на Windows 7 работает точно JSCRIPT 5.8.

теперь я временно решил это проблема (в немного сложном скрипте), создав новый текстовый файл и вручную составив допустимую строку JSON (и, очевидно, это делает все работает нормально, даже если в системе нет JSCRIPT 5.8 как запрошено для JSON), но мне нравится знать две вещи в основном:

1-й почему я не могу использовать объект JSON, даже если моя версия JSCRIPT поддерживает этот объект?

2-й Я прочитайте что-нибудь о "включении" JSON (и другие) недоступный объект в моей среде JSCRIPT, но все примеры для C#, и мне нравится знать, существует ли какой-то эквивалентный код для JSCRIPT или нет.

2 ответов


почему я не могу использовать объект JSON, даже если моя версия JSCRIPT поддерживает этот объект?

По данным MSDN, Windows Script Host использует функцию JScript 5.7, установленную по умолчанию для обратной совместимости. Набор функций JScript 5.8 используется только в Internet Explorer в режимах документов IE8+ Standards.

у вас есть следующие варианты:

  1. включить json2.js в вашей скрипт. См.этот вопрос для параметров включения внешних скриптов в Скрипты JScript.

  2. измените реестр на разоблачить движок JScript IE9 для Windows Script Host. UPD: это решение использует библиотеки JScript IE, но не активирует набор функций 5.8.

  3. создайте узел выполнения JScript программно использование активных интерфейсов скриптов и использование IActiveScriptProperty::SetProperty для принудительного набора функций JScript 5.8 (SCRIPTLANGUAGEVERSION_5_8). вот пример C++.

Я прочитал что-то о "включении" JSON (и другого) недоступного объекта в моей среде JSCRIPT, но все примеры для C#, и мне нравится знать, существует ли какой-то эквивалентный код для JSCRIPT или нет.

пользовательские хосты выполнения скриптов могут быть созданы только с использованием языков с надлежащей поддержкой COM, таких как C++, C# и т. д. JScript нельзя использовать для этого, потому что, например, он не поддерживает параметры.


можно использовать eval() для достижения эффекта, аналогичного JSON.parse().

eval('obj = {' + JSONstring + '}');

, а потом obj.toString() позволит вам получить данные, аналогичные JSON.stringify() (только без вариантов украшения). посмотреть этот ответ для примера в дикой природе. Дело в том, что вы можете создать объект из текста JSON без необходимости загружать внешние библиотеки или переключать механизм интерпретатора.

БОЛЬШОЕ ЖИРНОЕ ПРЕДУПРЕЖДЕНИЕ!!!

это вводит уязвимость рабочей станции, на которой выполняется код. Если вы не контролируете генерацию JSON, которую хотите проанализировать, или если возможно, что третья сторона может изменить JSON между его генерацией и его интерпретацией, то рассмотрите следующее Хелен. Если плохие вещи находятся в 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"
    }

... затем разбор его с eval будет только что добавили нового администратора на ваш компьютер без каких-либо визуальных признаков того, что это произошло.

мой совет, не стесняйтесь использовать eval для частного или случайного использования; но для широкого развертывания рассмотрите возможность включения json2.js как Елена советует. Edit: или...

htmlfile COM-объект

вы можете импортировать методы JSON, вызвав htmlfile COM-объект и принуждение его к совместимости с IE9 (или выше) режим с помощью <META> тег, как это:

var htmlfile = WSH.CreateObject('htmlfile'), JSON;
htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9" />');
htmlfile.close(JSON = htmlfile.parentWindow.JSON);

С этими тремя строками объект и методы JSON копируются в среду выполнения JScript, позволяя анализировать JSON без использования eval() или загрузка json2.js. Теперь вы можете делать такие вещи:

var pretty = JSON.stringify(JSON.parse(json), null, '\t');
WSH.Echo(pretty);

Вот описание:

// 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);

посмотреть этот ответ для других методов (json2.JS скачать через XHR,InternetExplorer.Application COM-объект, гибридный метод HTA и другой пример htmlfile).