Хранение древовидных структур в JSON - PullRequest
0 голосов
/ 12 мая 2011

Я пытаюсь написать систему, в которой клиент (на основе браузера) запрашивает дерево, которое должно быть возвращено с сервера (механизм приложений, но это не имеет значения). Проблема заключается в преобразовании дерева в JSON: поскольку каждый объект ссылается на объекты «под ним», при его разбивке я получаю чрезвычайно длинную строку, которая при разборе создает новые объекты для каждого дочернего элемента вместо ссылок на другие узлы.

Моим текущим решением было бы написать функции «equalTo» и «toString» (преобразование ссылок на объекты в строки), чтобы преобразовать в массив массив, а затем воссоздать его на стороне клиента, разрешив строки в объектах. Это решение заставляет мои чувства ужасного алгоритма покалывать, но должен быть лучший способ вернуть такие структуры через JSON!

РЕДАКТИРОВАТЬ: мне просто пришло в голову, что ссылки на объекты также могут быть преобразованы в индексы массива. Это лучшее решение, но в нем все еще чувствуется плохой код.

EDIT2: Верно, так что я полагаю, что псевдокод в порядке.

var node = {
    children : null;
};

var root = Object.create(node);

var level1a = Object.create(node);
var level1b = Object.create(node);
var level2a = Object.create(node);
var level2b = Object.create(node);

root.children = [level1a, level1b];
level1a.children = [level2a, level2b];

Итак, вы получите дерево, которое выглядит так: stackoverflow не позволяет мне публиковать изображения

Ответы [ 2 ]

0 голосов
/ 13 мая 2011

Если вы можете помочь, не ограничивайте себя JSON. Вместо этого рассмотрите возможность создания кода JavaScript, включенного с помощью связанного скрипта, при необходимости используя методы JSONP.

0 голосов
/ 13 мая 2011

Если у вас есть способ адресации узлов, вы можете использовать JSON revivers и replaces для преобразования между адресами и ссылками.

Например, если у вас есть две функции, такие как

function addressForNode(node) { ... }

function nodeForAddress(address) { ... }

вы можете использовать ревери и заменители, которые вызывают их при разборе или строковом кодировании

var jsonString = JSON.stringify(tree, function (key, value) {
  if (typeof value === 'object') {
    var address = addressForNode(value);
    if (address !== null) {  // value really is a node
      return { address: address }
    }
  }
  return value;
});

// And to parse...
var tree = JSON.parse(jsonString, function (key, value) {
  if (typeof value === 'object' && typeof value.address === 'string') {
    return nodeForAddress(value.address);
  }
  return value;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...