вид достижения цели ...
Короткая версия: Мне пришлось изменить json2.asp и взломать определение функции stringify (), чтобы она работала.
Длинная версия
позже, чтобы увидеть каждую строку кода и разочароваться в проблеме.я решил взглянуть на json2.asp (AX Framework) и попытаться увидеть, что там происходит.
посмотрите, что я вижу:
из строк 682–687 есть проверка, если найден нестандартный строковый анализатор, но позже он ничего не делает ... только возвращает значение объекта.
отсюда есть предположение, потому что яплохо понимаю, как работает каждая реализация Javascript, но подразумевает , что исходный код работает хорошо, что стандартный интерпретатор javascript ( читает все остальное, кроме microsoft здесь ) заставит сериализациюобъект в этой ситуации, но интерпретатор JScript пытается проанализировать объект и передать значение как null .в результате чего каждая функция, использующая пользовательский stringyfier, не может прочитать объект, переданный в функцию.
что я сделал, чтобы решить, хорошо, я вставил этот кусок кода перед строкой 688, заставив выполнить пользовательский stringyfier сзначение напрямую передается в качестве аргумента, избегая неявного анализа.
// Hack & patch to deliver the stringify-ing of the object correctly
// IDK if this is CORRECT or dont but it works in VbScript
if(replacer){
var textval = rep(this,'',value);
value = textval;
}
позже мне пришлось внести некоторые изменения в json-stringify-parser.asp , потому что мне пришлось исправить некоторые ошибки, приводящие кcode
<!--#include file="vbsTyper.asp" -->
<script runat="server" language="JScript">
function JSONStringify(object) {
//VBSTypeName(object);
return JSON.stringify(object,stringifyData,4);
}
function stringifyData(holder, key, value) {
var sType = '';
var result;
//response.write('pre...holder=' + holder + ',key=' + key + ',value=' + value);
sType = VBSTypeName(value);
//response.write('post =' + sType);
//response.write(sType);
switch(sType){
case 'Dictionary':
result = '{';
for(var enr = new Enumerator(value); !enr.atEnd(); enr.moveNext()){
key = enr.item();
result += '"' + key + '": ' + JSON.stringify(value.Item(key));
};
result += '}';
return(result);
break;
case 'Recordset':
//response.write('here!!!');
var sTemp;
result = '';
while(!value.EOF){
if(result.length > 0){
result += ',';
}
result += '{';
sTemp=''
for (var i = 0; i < value.fields.Count; i++){
if(sTemp.length > 0){
sTemp += ',';
}
//response.write("i=" + i + ",");
sTemp += '"' + value.fields.item(i).name + '":' + JSON.stringify( value.fields.item(i).value);
};
result += sTemp + '}';
value.moveNext();
}
result = '{' + result + '}';
return result;
break;
default:
//response.write(sType);
return(value);
}
// return the value to let it be processed in the usual way
return result;
}
</script>
часть для разбора Recordset работает, часть для разбора словаря такая же, как показано в JSON.Stringify не работает на объектах Scripting.Dictionary (aka i haven 'пока не проверял) но пока я с этим покончил.
проверка моих изменений с помощью объекта набора записей приводит к таким выводам
"{
{\"clave\":\"BC\",\"descripcion\":\"Cal\"},
{\"clave\":\"CT\",\"descripcion\":\"Center\"},
{\"clave\":\"NE\",\"descripcion\":\"Norw\"},
{\"clave\":\"NO\",\"descripcion\":\"Nore\"},
{\"clave\":\"NT\",\"descripcion\":\"North\"},
{\"clave\":\"OC\",\"descripcion\":\"East\"},
{\"clave\":\"OR\",\"descripcion\":\"West\"},
{\"clave\":\"PE\",\"descripcion\":\"Pen\"},
{\"clave\":\"SE\",\"descripcion\":\"Southe\"},
{\"clave\":\"ZM\",\"descripcion\":\"Met\"}
}"
Оставленные вопросы
вопрос, который я оставил с таким взломом.
Это нормально, что вывод имеет символ (") в начале и в конце, и все остальное имеет escape-выражения ?? или это то, что не должно происходить.
этот вид взлома действительно неправильный ... я могу сделать это лучше, в такой ситуации?
что-то не так в моем заключении или аргументах ??