我已经看到了许多不同的JSON日期格式标准:
"\"\\/Date(1335205592410)\\/\"" .NET JavaScriptSerializer
"\"\\/Date(1335205592410-0500)\\/\"" .NET DataContractJsonSerializer
"2012-04-23T18:25:43.511Z" JavaScript built-in JSON object
"2012-04-21T18:25:43-05:00" ISO 8601
Run Code Online (Sandbox Code Playgroud)
哪一个是正确的?还是最好的?这有什么标准吗?
我有一个基本的词典如下:
sample = {}
sample['title'] = "String"
sample['somedate'] = somedatetimehere
Run Code Online (Sandbox Code Playgroud)
当我尝试做的时候,jsonify(sample)我得到:
TypeError: datetime.datetime(2012, 8, 8, 21, 46, 24, 862000) is not JSON serializable
我能做些什么,以便我的字典样本可以克服上述错误?
注意:虽然它可能不相关,但字典是从mongodb中检索记录生成的,当我打印输出时str(sample['somedate']),输出是2012-08-08 21:46:24.862000.
我一直在寻找一段时间没有成功.我的项目没有使用Django,是否有一种简单的方法将App Engine模型(google.appengine.ext.db.Model)序列化为JSON,还是需要编写自己的序列化程序?
模型:
class Photo(db.Model):
filename = db.StringProperty()
title = db.StringProperty()
description = db.StringProperty(multiline=True)
date_taken = db.DateTimeProperty()
date_uploaded = db.DateTimeProperty(auto_now_add=True)
album = db.ReferenceProperty(Album, collection_name='photo')
Run Code Online (Sandbox Code Playgroud) 我想将日志文件中的UTC时间戳与本地时间戳进行比较.在创建本地datetime对象时,我使用如下内容:
>>> local_time=datetime.datetime(2010, 4, 27, 12, 0, 0, 0,
tzinfo=pytz.timezone('Israel'))
Run Code Online (Sandbox Code Playgroud)
我想找到一个自动工具来取代tzinfo=pytz.timezone('Israel')当前的本地时区.
有任何想法吗?
为什么json序列化不适用于datetime对象.据我了解json序列化,任何对象的基本思想都可以调用 __str__内置函数,然后将你获得的对象作为响应进行urlencode.但是在datetime的情况下,我得到以下错误
TypeError: datetime.datetime(2012, 5, 23, 18, 38, 23, 37566) is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
虽然有__str__一种方法可以对已经可用的物体进行字符串化,但似乎有意识地决定不这样做,为什么会出现这种情况呢?
我正在尝试将一个来自Django的查询集传递给一个带有javascript的模板.
我尝试过不同的方法来解决这个问题:
1.正常方法 - 由于命名法,Javascript会因为尝试解析对象而搞得一团糟[> Object:ID<> Object:ID< ...]
Django View
django_list = list(Some_Object.objects.all())
Run Code Online (Sandbox Code Playgroud)
模板HTML + JS
<script type="text/javascript" >
var js_list = {{django_list}};
</script>
Run Code Online (Sandbox Code Playgroud)
2. JSON方法 - Django无法将对象列表转换为json字符串,而不是JSON可序列化的
Django View
django_list = list(Some_Object.objects.all())
json_list = simplejson.dumps(django_list)
Run Code Online (Sandbox Code Playgroud)
模板HTML + JS
<script type="text/javascript" >
var js_list = {{json_list}};
</script>
Run Code Online (Sandbox Code Playgroud)
所以,我需要一些帮助:)
有人有任何建议/解决方案吗?
谢谢!
我想用JSON编码对象.但是,我无法弄清楚如何在没有字符串转义的情况下进行输出.
import json
class Abc:
def __init__(self):
self.name="abc name"
def toJSON(self):
return json.dumps(self.__dict__, cls=ComplexEncoder)
class Doc:
def __init__(self):
self.abc=Abc()
def toJSON(self):
return json.dumps(self.__dict__, cls=ComplexEncoder)
class ComplexEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Abc) or isinstance(obj, Doc):
return obj.toJSON()
else:
return json.JSONEncoder.default(self, obj)
doc=Doc()
print doc.toJSON()
Run Code Online (Sandbox Code Playgroud)
结果是(转储返回一个字符串表示,这就是"被转义"的原因)
{"abc": "{\"name\": \"abc name\"}"}
Run Code Online (Sandbox Code Playgroud)
我想要一些不同的东西.预期的结果是
{"abc": {"name": "abc name"}"}
Run Code Online (Sandbox Code Playgroud)
但我不知道如何...任何提示?
提前致谢.
是否有任何优雅的方式使Python JSON编码器支持日期时间?一些第三方模块或简单的黑客?
我正在使用龙卷风的数据库包装器从db中获取一些原始数据以生成json.查询结果包括常规MySQL时间戳列.
Python的默认json编码器不支持自己的日期时间类型,这是非常烦人的,这在所有类型的数据库查询中都很常见.
我不想修改Python自己的json编码器.任何好的做法?非常感谢!
ps:我通过修改Python JSON编码器默认方法找到了一个脏黑客:
更改:
def default(self, o):
raise TypeError(repr(o) + " is not JSON serializable")
Run Code Online (Sandbox Code Playgroud)
至:
def default(self, o):
from datetime import date
from datetime import datetime
if isinstance(o, datetime):
return o.isoformat()
elif isinstance(o, date):
return o.isoformat()
else:
raise TypeError(repr(o) + " is not JSON serializable")
Run Code Online (Sandbox Code Playgroud)
好吧,它只是开发环境的临时解决方案.
但是对于长期解决方案或生产环境,这非常难看,每次部署到新服务器时我都必须进行修改.
有没有更好的办法?我不想修改Python代码本身,也不想修改Tornado源代码.我能用自己的项目代码做些什么来实现这一目标吗?最好是一步到位.
非常感谢!
我正在尝试通过zmq ipc socket发送一个现有的dict,我可以用这段代码发送一个字符串,但我不能发送一个dict对象
import zmq, datetime
d = {0: ('356612022462768', 'EVENT', 0, '2012-12-26 15:50:16', -20.22216, -70.13723, 6.44, 134.0, 1, 2, '18743230', datetime.datetime(2013, 2, 10, 9, 6, 2, 362734))}
if __name__ == "__main__":
context = zmq.Context()
publisher = context.socket(zmq.PUB)
publisher.connect("ipc://shared")
while True:
publisher.send( d )
time.sleep( 1 )
Run Code Online (Sandbox Code Playgroud)
TypeError: {0: ('356612022462768', 'EVENT', 0, '2012-12-26 15:50:16',
-20.22216, -70.13723, 6.44, 134.0, 1, 2, '18743230',
datetime.datetime(2013, 2, 10, 9, 6, 2, 362734))}
does not provide a buffer interface.
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
目前我这样做:
def getJSONString(lst):
join = ""
rs = "{"
for i in lst:
rs += join + '"' + str(i[0]) + '":"' + str(i[1]) + '"'
join = ","
return rs + "}"
Run Code Online (Sandbox Code Playgroud)
我称之为:
rs = getJSONString([("name", "value"), ("name2", "value2")])
Run Code Online (Sandbox Code Playgroud)
它不需要嵌套(它只是一个简单的名称值对列表).但我愿意以不同的方式调用函数.这一切看起来有点笨拙,有更优雅的方式吗?这需要在2.x下运行.
请注意,这不是重复:Python - 将元组列表转换为字符串(除非可以修改该答案以创建JSON字符串作为输出).
编辑:将名称值对作为字典传递会更好吗?