如何在python

时间:2017-04-28 10:02:15

标签: python json

在后端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)

2 个答案:

答案 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)