У меня есть набор объектов Python, которые я создаю с помощью eulxml.xmlmap.XmlObject
(я использую этот метод в первую очередь потому, что работаю с сервером eXistDB, а eulxml предлагает довольно простую функцию сопоставления). Я могу успешно запросить свою eXistDB и загрузить набор результатов xquery в некоторые созданные мной объекты python. Моя проблема в том, что я хочу иметь возможность записывать эти объекты как JSON, когда я передаю их на веб-сервер (используя Angular для внешнего интерфейса).
Я пытался использовать jsonpickle, но кажется, что eulxml выполняет какую-то магию ленивой загрузки. Стандартный вызов jsonpickle для сериализации моего объекта в json дает мне такой результат:
код питона:
jsonpickle.encode(myObject)
результат:
"py/object": "models.alcalaPage.AlcalaPage", "context":
{"namespaces":
{"exist": "http://exist.sourceforge.net/NS/exist"}
},
"node": {
"py/object": "lxml.etree._Element",
"py/seq": [
{"py/object": "lxml.etree._Comment", "py/seq": []},
{"py/object": "lxml.etree._Element", "py/seq": []},
...
]
}...
кажется, что он выводит только тип атрибута, но не значение самого атрибута. Если я изменю свой код jsonpickle, чтобы установить unpickable=False, все, что я получу, это пустой набор json (это означает, что структура существует с точки зрения правильного количества фигурных скобок и скобок, но буквально нет данных. Вывод json: только фигурные скобки и скобки).
Я подумал, что, возможно, если я попытаюсь получить доступ к значению в поле, а затем выведу json, это может сработать (по крайней мере, для поля, к которому я обращался), но не повезло. Я получаю тот же результат, что и выше (и да, я дважды проверил, что в самом объекте есть данные).
Я как бы в растерянности в этот момент. Я мог бы перейти на что-то вроде BeautifulSoup, но это требует написания НАМНОГО большего количества кода (eulxml позволяет мне просто указать xpath к значению, которым я хочу заполнить свой атрибут, и bing, я готов). Есть ли что-то, что мне не хватает с jsonpickle? Или есть другой пакет json, на который я должен посмотреть? Или, может быть, я делаю этот способ более сложным, чем мне нужно, и есть другой способ запросить eXistDB с помощью python, а затем отправить информацию во внешнее приложение, созданное с использованием Angular. Я открыт для предложений.
Я приведу примеры своего кода ниже (я не буду включать все это, потому что, вероятно, я работаю с 10+ объектами):
Пример кода объекта с eulxml:
import jsonpickle
from eulxml.xmlmap import XmlObject
class AlcalaBase(XmlObject):
def to_xml(self):
return self.serializeDocument(pretty=True)
def to_json(self):
return jsonpickle.encode(self)
from eulxml import xmlmap
from models.alcalaBase import AlcalaBase
class AlcalaPage(AlcalaBase):
ROOT_NAME = 'page'
id = xmlmap.StringField('pageID')
archive_page_number = xmlmap.StringField('archivistsPageNumber')
year = xmlmap.IntegerField('content/@yearID')