Это не так просто, как кажется, некоторые функции ядра библиотеки не работают, когда только ул переписывается (проверено с Python 2.7), см. Эту резьбу для примеров How to make a class JSON serializable Кроме того, попробуйте это
import json
class A(unicode):
def __str__(self):
return 'a'
def __unicode__(self):
return u'a'
def __repr__(self):
return 'a'
a = A()
json.dumps(a)
производит
'""'
и не
'"a"'
, как можно было бы ожидать.
EDIT: отвечая на комментарий mchicago в:
Юникода не имеет каких-либо атрибутов - это непреложный строка, значение которой скрыт и не доступен из кода Python высокого уровня. Модуль json
использует re
для генерации строкового представления, которое, похоже, имеет доступ к этому внутреннему атрибуту.Вот простой пример, чтобы оправдать это:
b = A('b') print b
производит
'a'
в то время как
json.dumps({'b': b})
производит
{"b": "b"}
так что вы видите, что внутреннее представление используется некоторыми родными библиотеками, возможно, по соображениям производительности.
Смотрите также это для более подробной информации: http://www.laurentluce.com/posts/python-string-objects-implementation/
Что это SLK? –
slk - ошибка ввода. исправленный. – snakile