我从数据库中提取一个十进制值的总和.我正在尝试在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) 我有一个包含Decimal对象的查询集.我想将这些数据传递给json转储行:
ql = Product.objects.values_list('length', 'width').get(id=product_id)
data = simplejson.dumps(ql)
TypeError: Decimal('62.20') is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
我应该如何将这些值传递给json.当然我可以将值转换为字符串 - 但我猜这不是一个好的解决方案.
任何帮助非常感谢.
我正在运行Python 2.7,我正在尝试创建一个JSONEncoder的自定义FloatEncoder子类.我跟着很多例子,如本,但似乎没有工作.这是我的FloatEncoder类:
class FloatEncoder(JSONEncoder):
def _iterencode(self, obj, markers=None):
if isinstance(obj, float):
return (str(obj) for obj in [obj])
return super(FloatEncoder, self)._iterencode(obj, markers)
Run Code Online (Sandbox Code Playgroud)
这里是我调用json.dumps的地方:
with patch("utils.fileio.FloatEncoder") as float_patch:
for val,res in ((.00123456,'0.0012'),(.00009,'0.0001'),(0.99999,'1.0000'),({'hello':1.00001,'world':[True,1.00009]},'{"world": [true, 1.0001], "hello": 1.0000}')):
untrusted = dumps(val, cls=FloatEncoder)
self.assertTrue(float_patch._iterencode.called)
self.assertEqual(untrusted, res)
Run Code Online (Sandbox Code Playgroud)
第一个断言失败,意味着_iterencode没有被执行.在阅读JSON文档之后,我尝试重写default()方法,但也没有被调用.
我正在运行一个SQL查询,它返回一个Decimal列表.当我尝试将其转换为JSON时,我得到类型错误.
查询:
res = db.execute("""
SELECT CAST ((SUM(r.SalesVolume)/1000.0) AS decimal(6,1))
FROM RawData r
INNER JOIN Product p
ON r.ProductId = p.ProductId
INNER JOIN Calendar c
ON r.DayId = c.DayId
WHERE c.WeekCodeInYear BETWEEN 1 AND 12
AND
c.YearId = 2014
GROUP BY c.WeekCodeInYear """)
Run Code Online (Sandbox Code Playgroud)
结果清单:
[Decimal('34.3'), Decimal('50.9'), Decimal('31.5'), Decimal('23.3'), Decimal('19
.7'), Decimal('56.9'), Decimal('43.8'), Decimal('35.2'), Decimal('29.2'), Decima
l('43.7'), Decimal('42.6'), Decimal('23.4')]
Run Code Online (Sandbox Code Playgroud)
码:
for row in res:
testlist.append (row[0])
print testlist
list = json.dumps(testlist)
Run Code Online (Sandbox Code Playgroud)
而且我在Unable to serialize error
网上查找了Tried,没有多大帮助.请注意,最终列表将作为输入数据输入图表.
可能的重复:
Python JSON 序列化 Decimal 对象
任务:将包含混合数据类型(整数/字符串/小数/...)作为值的字典转换为 JSON 数组。
我知道如何将 python 字典转换为 JSON:
D = {key1:val1, key2,val2}
import json
jD = json.dumps(D)
Run Code Online (Sandbox Code Playgroud)
我还知道十进制值必须转换为字符串,否则 python 会抛出“十进制不是 json 可序列化”的错误。
所以我需要遍历字典来查找数据类型。
for key in D.keys():
if type(key) == '<class "decimal.Decimal">': ## this is erroneous. pl. suggest correction
D[key] = str(D[key])
Run Code Online (Sandbox Code Playgroud)
但这种编程涉及手工编码和硬编码。
如果我得到嵌套字典结构,则再次需要硬编码(这是错误的)。
是否有其他方法/技巧可以从 dict 中的任何数据类型获取 JSON 数组?
我有使用Flask-SQLAlchemy的此模型:
class Menu(Document, db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(80), unique=True, index=True)
price = db.Column(db.Numeric)
Run Code Online (Sandbox Code Playgroud)
我可以使用Flask-Restless为此模型创建api。问题是当我从api URL进行HTTP GET时:
File "/usr/lib/python2.6/json/encoder.py", line 344, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: Decimal('10000.0000000000') is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
问题很明显,JSON编码器无法编码映射到价格(数字列类型)的十进制值。是否有任何使用自定义JSON编码器启用Flask-Restless的解决方法?
因此,DecimalField如果我知道将我的模型数据序列化为 JSON 有多么困难,我永远不会使用 Django 的选项。
长话短说,我如何从 a 获取浮点值DecimalField?
我的模型看起来像这样:
class DailyReport(models.Model):
earnings = models.DecimalField(max_digits=12, decimal_places=4)
def earnings_float(self):
return self.earnings.to_float()
Run Code Online (Sandbox Code Playgroud)
显然没有to_float()可用的方法,那么我该怎么办?
以下是后来的补充:
这有效:
class DailyReport(models.Model):
earnings = models.DecimalField(max_digits=12, decimal_places=4)
def earnings_float(self):
return float(self.earnings)
Run Code Online (Sandbox Code Playgroud)
但这似乎也太复杂了。我正在尝试将 django-rest-framework 用于所有序列化,因为我通常将它用于我的应用程序中的 rest-framework 内容。在这种特殊情况下,我只想将我的数据转换和序列化为 python 列表和字典,然后通过 pymongo 3 将它们作为文档存储在 Mongo DB 中。
这个问题已经被问,但没有回答这样一个.
在我的view.py数据中从MySQL中提取数据,例如:
(Decimal('13'), Decimal('6'), Decimal('13'))
(Decimal('207'), Decimal('18'), Decimal('129'))
(Decimal('301'), Decimal('38'), Decimal('193'))
(Decimal('204'), Decimal('32'), Decimal('150'))
(Decimal('159'), Decimal('25'), Decimal('88'))
args = {'array':array}
return render_to_response('page2.html', args)
Run Code Online (Sandbox Code Playgroud)
试图把它放入谷歌图表
function drawChart() {
var djangoData = JSON.parse('{{ args }}');
var data = google.visualization.arrayToDataTable(djangoData);
Run Code Online (Sandbox Code Playgroud)
也试过var djangoData = {{ array }};
两个没有运气!
建议
return render_to_response('page2.html', {'array': json.dumps(array)})
Run Code Online (Sandbox Code Playgroud)
看起来它会起作用,除了db产生不兼容的类型.有没有办法在不将每个项目转换为int类型的情况下执行此操作.或者,如果有一种pythonic方式转换它?
使用选定的答案并添加|safe到数组,所以{{array|safe}}
我有一个这种格式的字符串,
d = {'details': {'hawk_branch': {'tandem': ['4210bnd72']}, 'uclif_branch': {'tandem': ['e2nc712nma89', '23s24212', '12338cm82']}}}
Run Code Online (Sandbox Code Playgroud)
我想以这种格式将它写入文件,将列表转换为字典并value为列表中的每个值添加单词作为键,所以{'tandem': ['4210bnd72']}应该成为
"tandem": {
"value": "4210bnd72"
}
Run Code Online (Sandbox Code Playgroud)
这是预期的输出文件,
{
"details": {
"hawk_branch": {
"tandem": {
"value": "4210bnd72"
}
},
"uclif_branch": {
"tandem": {
"value": "e2nc712nma89",
"value": "23s24212",
"value": "12338cm82",
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里问了一个问题,有人回答使用json.JSONEncoder,
class restore_value(json.JSONEncoder):
def encode(self, o):
if isinstance(o, dict):
return '{%s}' % ', '.join(': '.join((json.encoder.py_encode_basestring(k), self.encode(v))) for k, v in o.items())
if isinstance(o, list):
return '{%s}' % …Run Code Online (Sandbox Code Playgroud) TypeError: Object of type Decimal is not JSON serializable当我运行时,postman api我收到上述错误,因为sales_qty是十进制,我不知道如何decimal在for循环中解析并将其作为 json 返回
from flask import Flask, jsonify
import decimal,json
result= [('V_M_001', 'KITE', 'Napkin', 1, 2, 12, 0, Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')),
('V_M_001', 'KITE', 'Napkin', 2, 4, 34, 5, Decimal('1'), Decimal('4'), Decimal('0'), Decimal('0'))]
def fun():
for i in result:
data_all.append({
"machine_name":i.machine_name,
"location":i.location,
"item_name":i.item_name,
"row_no":i.row_no,
"require_minimum_stk_qty":i.require_minimum_stk_qty,
"capacity":i.capacity,
"stock_qty":i.stock_qty,
"sales_qty":i.sales_qty,
"available_qty":i.available_qty,
"sales_day_qty":i.sales_day_qty,
"sales_week_qty":i.sales_week_qty
})
return jsonify(data_all)
fun()
Run Code Online (Sandbox Code Playgroud)
输出:
TypeError: Object of type Decimal is …