2009-08-19 4 views
1

У меня есть большой иерархический набор данных в хранилище данных App Engine. Иерархия сохраняется за счет хранения данных в Entity группах, так что я могу тянуть целое дерево, просто зная, верхний ключ элемента, как так:Иерархические данные, выводимые из хранилища данных App Engine для JSON?

query = db.Query().ancestor(db.get(key))

Вопрос: Как я теперь вывести эту информацию в качестве JSON и сохранить иерархию?

У Google есть класс утилиты под названием GqlEncoder, который добавляет поддержку результатов запроса хранилища данных к simplejson, но в основном сглаживает данные, разрушая иерархию.

Любые предложения?

ответ

1

Я полагаю, вы имеете в виду this code и «уплощение» вы упоминаете делается линиями 51-52:

if isinstance(obj, db.GqlQuery): 
     return list(obj) 

в то время как остальная часть кода отлично подходит для ваших целей. Итак, как бы вы хотели представить запрос GQL, так как у вас нет того, что представляет собой массив JS (список Python) из содержащихся в нем объектов? Непонятно, помимо группы сущностей (которую вы полностью восстанавливаете), что дает ей иерархию; это вопрос «родителя»?

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

+0

Это проблема «родительского» и допускающая это как иерархию. Я мог бы изменить существующую библиотеку, но я решил, что сначала проверю, есть ли библиотека, которая уже поддерживала ее. – Christian

+0

@ Христиан, хорошее мышление, но я не знаю об одном. Я предлагаю вам извлечь этот 'list (obj)' использование в отдельный метод, чтобы базовый класс мог иметь неизменную функциональность, и подкласс может переопределить этот метод и выполнить требуемую дополнительную обработку (я предполагаю, что вам нужен вложенный список списков ?) при повторном использовании 99% функциональности базового класса - такой патч может быть принят в части с открытым исходным кодом движка приложения, и тогда вам не придется поддерживать его в будущем. –