Одна проблема может относиться к пользовательским маршрутизаторам, усекающим поля формы. Путь вокруг этого состоит в том, чтобы установить MaxPageStateFieldLength на небольшое количество (как 100) в web.config, и ViewState разбит в маленькие блоки. Очень просто сделать, и , эта статья объясняет это полностью.
Напишите свой собственный кодировщик и декодер, который может быть очень простым, например return __dict __
например, вот кодировщик для вывода полностью рекурсивной древовидной структуры, вы можете улучшить его или использовать как он предназначен для ваших собственных целей
import json
class Tree(object):
def __init__(self, name, childTrees=None):
self.name = name
if childTrees is None:
childTrees = []
self.childTrees = childTrees
class MyEncoder(json.JSONEncoder):
def default(self, obj):
if not isinstance(obj, Tree):
return super(MyEncoder, self).default(obj)
return obj.__dict__
c1 = Tree("c1")
c2 = Tree("c2")
t = Tree("t",[c1,c2])
print json.dumps(t, cls=MyEncoder)
он печатает
{"childTrees": [{"childTrees": [], "name": "c1"}, {"childTrees": [], "name": "c2"}], "name": "t"}
, вы можете аналогичным образом написать декодер, но вам нужно будет каким-то образом определить, является это вашим объектом или нет, так что, возможно, вы также можете указать тип, если необходимо.
Косвенный ответ: вместо использования JSON вы можете использовать YAML , что позволяет без проблем делать то, что вы хотите. (JSON по сути является подмножеством YAML.)
Пример:
import yaml
o1 = gwebpage("url")
o2 = gpagelet(o1)
o1.gpagelets = [o2]
print yaml.dump(o1)
Фактически, YAML прекрасно обрабатывает циклические ссылки за вас.