如何使 Marshmallow (>=3.0) 将 fields.Dict() 中的数字视为小数
How to make Marshmallow (>=3.0) treat numbers in fields.Dict() as Decimals
我有一个 JSON API,其中一个字段定义为 fields.Dict
- 数据可以包含有效的 JSON 并且它的内容留给用户决定。
但是,现在存在一个问题,即用户不能使用小数(需要将它们存储为字符串),因为存储后端 (DynamoDB) 仅支持 Decimal
不支持 float
- 并且传递 json.loads(... parse_float=Decimal)
不起作用,因为反序列化是由 Marshmallow 完成的。
我如何强制棉花糖(递归地)将 fields.Dict
中所有带有 .
的数字视为 Decimal
或强制棉花糖始终传递 parse_float
参数到JSON加载?
How can I [...] force marshmallow to always pass the parse_float
parameter to JSON load?
您可以指定自定义 render_module
。
import json
class MyJsonDecimalLoader:
@staticmethod
def loads(data):
return json.loads(data, parse_float=Decimal)
class MySchema(marshmallow.Schema):
class Meta:
render_module = MyJsonDecimalLoader
[...]
我不知道如何使用棉花糖字段做得更好,因为字典值中的数据结构定义松散。
我有一个 JSON API,其中一个字段定义为 fields.Dict
- 数据可以包含有效的 JSON 并且它的内容留给用户决定。
但是,现在存在一个问题,即用户不能使用小数(需要将它们存储为字符串),因为存储后端 (DynamoDB) 仅支持 Decimal
不支持 float
- 并且传递 json.loads(... parse_float=Decimal)
不起作用,因为反序列化是由 Marshmallow 完成的。
我如何强制棉花糖(递归地)将 fields.Dict
中所有带有 .
的数字视为 Decimal
或强制棉花糖始终传递 parse_float
参数到JSON加载?
How can I [...] force marshmallow to always pass the
parse_float
parameter to JSON load?
您可以指定自定义 render_module
。
import json
class MyJsonDecimalLoader:
@staticmethod
def loads(data):
return json.loads(data, parse_float=Decimal)
class MySchema(marshmallow.Schema):
class Meta:
render_module = MyJsonDecimalLoader
[...]
我不知道如何使用棉花糖字段做得更好,因为字典值中的数据结构定义松散。