Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python json序列化日期时间_Python_Django_Json_Serialization - Fatal编程技术网

python json序列化日期时间

python json序列化日期时间,python,django,json,serialization,Python,Django,Json,Serialization,首先,一个关于术语的简单问题, 编码(json.dumps)意味着将某物转换为json字符串, 解码(json.loads)意味着将json字符串转换为json类型(?) 我有一张我从中得到的物品清单 >>> album_image_list = AlbumImage.objects.all().values(*fields)[offset:count] >>> json.dumps(album_image_list[0], cls=DjangoJSONEn

首先,一个关于术语的简单问题,
编码(
json.dumps
)意味着将某物转换为json字符串,
解码(
json.loads
)意味着将json字符串转换为json类型(?)


我有一张我从中得到的物品清单

>>> album_image_list = AlbumImage.objects.all().values(*fields)[offset:count]
>>> json.dumps(album_image_list[0], cls=DjangoJSONEncoder)
'{"album": 4, "album__title": "g jfd", "created_at": "2012-08-18T02:23:49Z", "height": 1024.0, "width": 512.0, "url_image": "http://--:8000/media/101ac908-df50-42cc-af6f-b172c8829a31.jpg"}'
但当我在整个列表(相册图片列表)上尝试相同的方法时,它失败了

>>> json.dumps(album_image_list, cls=DjangoJSONEncoder)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.6/json/__init__.py", line 237, in dumps
    **kw).encode(obj)
  File "/usr/lib/python2.6/json/encoder.py", line 367, in encode
    chunks = list(self.iterencode(o))
  File "/usr/lib/python2.6/json/encoder.py", line 317, in _iterencode
    for chunk in self._iterencode_default(o, markers):
  File "/usr/lib/python2.6/json/encoder.py", line 323, in _iterencode_default
    newobj = self.default(o)
  File "/home/--/virtualenvs/aLittleArtist/lib/python2.6/site-packages/django/core/serializers/json.py", line 75, in default
    return super(DjangoJSONEncoder, self).default(o)
  File "/usr/lib/python2.6/json/encoder.py", line 344, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: [{'album': 4L, 'album__title': u'g jfd', 'created_at': datetime.datetime(2012, 8, 18, 2, 23, 49, tzinfo=<UTC>), 'height': 1024.0, 'width': 512.0, 'url_image': u'http://--:8000/media/101ac908-df50-42cc-af6f-b172c8829a31.jpg'}, {'album': 4L, 'album__title': u'g jfd', 'created_at': datetime.datetime(2012, 8, 18, 1, 54, 51, tzinfo=<UTC>), 'height': 512.0, 'width': 512.0, 'url_image': u'http://--:8000/media/e85d1cf7-bfd8-4e77-b90f-d1ee01c67392.jpg'}] is not JSON serializable
>>> 
>>json.dumps(相册图像列表,cls=DjangoJSONEncoder)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python2.6/json/_init__.py”,第237行,转储
**千瓦)。编码(obj)
文件“/usr/lib/python2.6/json/encoder.py”,第367行,在encode中
chunks=list(self.iterencode(o))
文件“/usr/lib/python2.6/json/encoder.py”,第317行,在iterencode中
对于self.\u iterencode\u默认值(o,标记):
文件“/usr/lib/python2.6/json/encoder.py”,第323行,默认为
newobj=self.default(o)
默认情况下,文件“/home/-/virtualenvs/aLittleArtist/lib/python2.6/site packages/django/core/serializers/json.py”第75行
返回super(DjangoJSONEncoder,self).default(o)
默认情况下,文件“/usr/lib/python2.6/json/encoder.py”第344行
raise TypeError(repr(o)+“不可JSON序列化”)
TypeError:[{'album':4L,'album'UUUUU title':u'g jfd','created'u at':datetime.datetime(2012,8,18,2,23,49,tzinfo=),'height':1024.0,'width':512.0,'url\u image':u'http://--:8000/media/101ac908-df50-42cc-af6f-b172c8829a31.jpg'},{'album':4L,'album_uuutitle':u'g jfd','created_uat':datetime.datetime(2012,8,18,1,54,51,tzinfo=),“高度”:512.0,“宽度”:512.0,“url\u图像”:uhttp://--:8000/media/e85d1cf7-bfd8-4e77-b90f-d1ee01c67392.jpg'}]不可JSON序列化
>>> 

为什么它在一个元素上成功而在列表上失败

您使用的是哪个DjangoJSONEncoder? 看起来DjangoJSONEncoder可能不支持对结果列表进行编码

试试这个:

.values()
实际上并不返回列表。它返回一个json模块无法序列化的
ValuesQuerySet
。尝试将相册图像列表转换为列表:

json.dumps(list(album_image_list), cls=DjangoJSONEncoder)

如果只想将字典转储到JSON,只需使用JSON.dumps。通过传入自定义序列化类,可以很容易地序列化对象-Django中已经包含了一个处理日期时间的类:

from django.core.serializers.json import DjangoJSONEncoder
json.dumps(mydictionary, cls=DjangoJSONEncoder)

这将帮助您序列化datetime对象

QuerySet有“延迟加载”的概念,尽管我不太了解它是如何工作的。“lazy”是否意味着它实际上是延迟加载“fields”数据的?。我猜ValuesQuerySet已经获取了“字段数据”,与延迟加载无关?我相信
ValuesQuerySet
也是延迟加载。在您实际遍历数据库或将其转换为列表之前,它不会访问数据库。
class DateTimeJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return obj.isoformat()
        else:
            return super(DateTimeJSONEncoder, self).default(obj)

updated_at=DateTimeJSONEncoder().encode(p.updated_at)