在后端django中我将数据作为json返回到frond end,但是在frondend中有许多“null”值,并且一个解决方案是在创建值时更改代码以将值转换为空字符串“”,但是因为有很多地方,我想编写一个自定义编码函数,在将obj转换为字符串时将None转换为“”。 我使用了以下类,但它不起作用:
class PythonObjectEncoder(json.JSONEncoder):
def encode(self, obj):
if obj is None:
obj = ''
return json.JSONEncoder().encode(obj)
data = [1,2,3,None,
[[[2],3],4]
]
j = json.dumps(data, cls=PythonObjectEncoder)
答案 0 :(得分:1)
执行此操作的一种方法是预先过滤json对象。例如,有这样的功能:
def fix_data(data):
if type(data) is list:
for i, e in enumerate(data):
if e is None:
data[i] = ''
else:
fix_data(e)
elif type(data) is dict:
for k, v in data.items():
if v is None:
data[k] = ''
else:
fix_data(v)
# Example:
data = ['1', None, '0', {'test' : None}]
fix_data(data)
print(data)
答案 1 :(得分:0)
无法告诉json解码器:
请对这段数据进行编码,但用{8}替换
None
替换null
的每个出现。
原因是此映射在json.scanner
中定义,不能更改。
但是,如果你知道在json编码之前你的数据是什么样的。您可以在编码之前预处理它们。这是一段与您的示例匹配的代码:
import json
class CustomListEncoder(json.JSONEncoder):
def encode(self, o):
if not isinstance(o, list):
raise TypeError("This encoder only handle lists")
none_to_empty_str = map(lambda x: "" if x is None else x, o)
return super().encode(list(none_to_empty_str))
json.dumps([1,2,None, [3, 4, 5]], cls=CustomListEncoder)