JSON.retrocycle преобразует только некоторые ссылки - PullRequest
1 голос
/ 12 августа 2011

У меня есть массив объектов, некоторые из которых имеют циклические ссылки. Поэтому я использовал JSON.decycle при отправке объекта через JSON и JSON.retrocycle на другом конце.

Примерно так:

var refactor_data = JSON.retrocycle(JSON.parse(event.data));

Проблема в том, что некоторые из объектов в 'refactor_data' преобразовывают ссылки JSONPath, а другие нет, и я не могу понять, почему.

Объекты довольно большие, но при необходимости я попытаюсь предоставить образец.

EDIT:
Вот пример объекта OK: http://pastebin.com/1hZDCipn
А вот образец разбитого объекта: http://pastebin.com/PfYCkrGt

EDIT2: Я думаю, что те, у кого ссылки заменены, на самом деле являются оригиналами, и ретроцикл на самом деле ничего не делает ни с одним из них. Может ли это быть потому, что они слишком «глубоко» в структуре объекта?

EDIT3: я пытался запустить в FireBug eval, который должен запускать ретроцикл: (я думаю, это нормально, чтобы это не работало)

EDIT4: я добавил console.log в функцию JSON.retrocycle, и eval () возвращает правильный объект, но возвращенный JSON и исходный JSON не изменены.

Спасибо.

1 Ответ

3 голосов
/ 22 августа 2011

Функция ретроцикла JSON-js cycle.js не ожидает, что путь будет иметь индекс массива больше 9.

Один пример пути, который не подвергается ретроциклированию:

$[11]["LegList"][0]["ItenaryList"][0]["Ar"]

Подобный путь, который получает ретроциклирование:

$[9]["LegList"][0]["ItenaryList"][0]["Ar"]

Если вы посмотрите на код cycle.js, вы увидите, что для ретроциклирования пути он должен проверяться на соответствие регулярному выражению.

// [...] A PATH is expected to be
// reasonably short. A PATH is allowed to belong to a very restricted subset of
// Goessner's JSONPath.

// So,
// var s = '[{"$ref":"$"}]';
// return JSON.retrocycle(JSON.parse(s));
// produces an array containing a single element which is the array itself.

var px =
    /^\$(?:\[(?:\d?|\"(?:[^\\\"\u0000-\u001f]|\\([\\\"\/bfnrt]|u[0-9a-zA-Z]{4}))*\")\])*$/;

В регулярном выражении px разрешены только индексы массива из одной цифры, а не два.
Поскольку путь не соответствует шаблону, он не заменит ссылку.

Вы можете попробовать использовать локальную копию cycle.js и изменить регулярное выражение px на:

var px = /^\$(?:\[(?:\d+|\"(?:[^\\\"\u0000-\u001f]|\\([\\\"\/bfnrt]|u[0-9a-zA-Z]{4}))*\")\])*$/;

Обратите внимание на отличие от предыдущего регулярного выражения: мы говорим, что теперь мы позволим одну или несколько цифр в индексах массива. Это достигается путем замены одного? символ после первого d с +.

Редактировать: Более новые версии функции ретроцикла cycle.js теперь позволяют индексам массива больше 9.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...