如何将Django QuerySet转换为dicts列表?我还没有找到答案,所以我想知道我是否错过了每个人都使用的某种常见助手功能.
我在python 2.6中使用标准的json模块来序列化浮点数列表.但是,我得到的结果如下:
>>> import json
>>> json.dumps([23.67, 23.97, 23.87])
'[23.670000000000002, 23.969999999999999, 23.870000000000001]'
Run Code Online (Sandbox Code Playgroud)
我希望浮点数只用两位小数进行格式化.输出应如下所示:
>>> json.dumps([23.67, 23.97, 23.87])
'[23.67, 23.97, 23.87]'
Run Code Online (Sandbox Code Playgroud)
我尝试过定义自己的JSON Encoder类:
class MyEncoder(json.JSONEncoder):
def encode(self, obj):
if isinstance(obj, float):
return format(obj, '.2f')
return json.JSONEncoder.encode(self, obj)
Run Code Online (Sandbox Code Playgroud)
这适用于唯一的浮动对象:
>>> json.dumps(23.67, cls=MyEncoder)
'23.67'
Run Code Online (Sandbox Code Playgroud)
但嵌套对象失败:
>>> json.dumps([23.67, 23.97, 23.87])
'[23.670000000000002, 23.969999999999999, 23.870000000000001]'
Run Code Online (Sandbox Code Playgroud)
我不想有外部依赖,所以我更喜欢坚持使用标准的json模块.
我怎样才能做到这一点?
Python的内部/嵌套类使我感到困惑.有没有它们无法实现的东西?如果是这样,那是什么东西?
我有一本字典,我正在尝试将其写入文件.
exDict = {1:1, 2:2, 3:3}
with open('file.txt', 'r') as file:
file.write(exDict)
Run Code Online (Sandbox Code Playgroud)
然后我有错误
file.write(exDict)
TypeError: must be str, not dict
Run Code Online (Sandbox Code Playgroud)
所以我修复了这个错误,但又出现了另一个错
exDict = {111:111, 222:222}
with open('file.txt', 'r') as file:
file.write(str(exDict))
Run Code Online (Sandbox Code Playgroud)
错误:
file.write(str(exDict))
io.UnsupportedOperation: not writable
Run Code Online (Sandbox Code Playgroud)
我不知道该怎么办,因为我还是python的初学者.如果有人知道如何解决问题,请提供答案.
注意:我使用的是python 3,而不是python 2
我正在使用AWS Lambda扫描DynamoDB表中的数据.这是我得到的回报:
{
"videos": [
{
"file": {
"S": "file1.mp4"
},
"id": {
"S": "1"
},
"canvas": {
"S": "This is Canvas1"
}
},
{
"file": {
"S": "main.mp4"
},
"id": {
"S": "0"
},
"canvas": {
"S": "this is a canvas"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
我的前端应用程序正在使用Ember Data Rest Adapter,它不接受此类响应.有什么方法可以获得正常的JSON格式吗?有一个NPM模块被调用dynamodb-marshaler来将DynamoDB数据转换为普通的JSON.如果可能的话,我正在寻找原生解决方案.
我有一个包含一些小数的python对象.这导致json.dumps()中断.
我从SO得到了以下解决方案(例如Python JSON序列化一个Decimal对象),但重新解决的解决方案仍然不起作用.Python网站 - 有完全相同的答案.
有任何建议如何使这项工作?
谢谢.以下是我的代码.看起来dumps()甚至没有进入专门的编码器.
clayton@mserver:~/python> cat test1.py
import json, decimal
class DecimalEncoder(json.JSONEncoder):
def _iterencode(self, o, markers=None):
print "here we go o is a == ", type(o)
if isinstance(o, decimal.Decimal):
print "woohoo! got a decimal"
return (str(o) for o in [o])
return super(DecimalEncoder, self)._iterencode(o, markers)
z = json.dumps( {'x': decimal.Decimal('5.5')}, cls=DecimalEncoder )
print z
clayton@mserver:~/python> python test1.py
Traceback (most recent call last):
File "test1.py", line 11, in <module>
z = json.dumps( {'x': decimal.Decimal('5.5')}, cls=DecimalEncoder )
File …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源代码.我能用自己的项目代码做些什么来实现这一目标吗?最好是一步到位.
非常感谢!
由于客户函数错误,Lambda 执行失败,状态为 200:“Decimal”类型的对象不可 JSON 序列化
我在以下链接中浏览了所有现有的解决方案,但没有任何对我有用。我做错了什么?: Python JSON 序列化 Decimal 对象
import json
import boto3
import decimal
client = boto3.resource('dynamodb')
table = client.Table('table')
def lambda_handler(event, context):
method = event["httpMethod"]
print(event)
if method=="POST":
return POST(event)
elif method=="DELETE":
return DELETE(event)
elif method=="GET":
return GET(event)
#the respons format
def send_respons(responseBody, statusCode):
response = {
"statusCode": statusCode,
"headers": {
"my_header": "my_value"
},
"body": json.dumps(responseBody),
"isBase64Encoded": 'false'
}
return response
def GET(event):
tab = table.scan()['Items']
ids = []
for item in tab:
ids.append({"id":item["id"], "decimalOBJ":decimal.Decimal(item["decimalOBJ"]}))
return …Run Code Online (Sandbox Code Playgroud) Python 没有内置的任意精度浮点数。这是一个例子:
>>> float(4.4257052820783003)
4.4257052820783
Run Code Online (Sandbox Code Playgroud)
因此,无论您使用什么,都不能拥有任意精度的浮点对象。
假设我有一个包含任意精度浮点数的JSON 字符串( )。json_string = '{"abc": 4.4257052820783003}'如果我加载该字符串,Python 将剪切该数字:
>>> dct = json.loads(json_string)
>>> dct
{'abc': 4.4257052820783}
Run Code Online (Sandbox Code Playgroud)
我设法通过使用以下方法来避免这种信息丢失decimal.Decimal:
>>> dct = json.loads(json_string, parse_float=Decimal)
>>> dct
{'abc': Decimal('4.4257052820783003')}
Run Code Online (Sandbox Code Playgroud)
现在,我想将此dct对象序列化为原始 JSON 格式的字符串。json.dumps(dct)显然不起作用(因为 Decimal 类型的对象不可 JSON 序列化)。我尝试子类化json.JSONEncoder并重新定义其default方法:
class MyJSONEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, Decimal):
return str(o)
return super().default(o)
Run Code Online (Sandbox Code Playgroud)
但这显然是创建一个字符串而不是数字:
>>> MyJSONEncoder().encode(dct)
'{"abc": "4.4257052820783003"}'
Run Code Online (Sandbox Code Playgroud)
如何将Decimal对象序列化为 JSON 数字(实数)而不是 JSON 字符串?换句话说,我希望编码操作返回原始json_string字符串。理想情况下不使用外部包(但仍然欢迎使用外部包的解决方案)。
这个问题当然非常相关,但我在那里找不到答案:Python …
我从数据库中提取一个十进制值的总和.我正在尝试在JSON结果中使用该值
json.dumps( { 'sum': amount } ) #where amount is my Decimal
Run Code Online (Sandbox Code Playgroud)
Django无法序列化Decimal.我可以将它转换为字符串,但我想在JSON中使用数字类型.如果我尝试将其转换为float最终超过2位小数.
如果可能,需要发生什么才能获得如下结果?
{ 'sum': 500.50 }
Run Code Online (Sandbox Code Playgroud) python ×8
json ×6
django ×2
aws-lambda ×1
class ×1
decimal ×1
dictionary ×1
file ×1
file-writing ×1
formatting ×1
ios5 ×1
mysql ×1
oop ×1
python-3.x ×1
tornado ×1