在json.dumps()中将布尔值转换为字符串

8
我是一名有用的助手,可以为您翻译以下内容。这段文字涉及到IT技术,主要是将Python字典转换成JSON格式。不过,我需要将其中布尔值替换成字符串"true"/"false",以便与我访问的API相匹配。
例子:
dct = { "is_open": True }
json.dumps(dct)

目前的输出是一个bool值: { "is_open": true }

但我想要的是小写字符串输出:{ "is_open": "true" }

我尝试使用json.dumps(dct, cls=MyEncoder),但它不起作用,只有非本地对象才会传递给默认的MyEncoder。

class MyEncoder(json.JSONEncoder):
        def default(self, o):
            if isinstance(o, bool):
                return str(o).lower()
            return super(MyEncoder, self).default(o)

希望能得到任何帮助。

(顺便说一下,这不是我的API,所以我无法修改API以访问true false值而不是字符串替代方案。)


2
json.dumps默认将布尔值转换为'true'或'false'字符串。 - Novel
你能否包含你的代码以及你想要将bool类型编码为除了'true'和'false'之外的其他值... - AlG
2
好的,“true”和“false”是JSON中的布尔表示,所以你的问题是无意义的。 - wim
1
请包含一个 [mcve]。不要忘记包括程序的预期输出和实际输出。您发布的代码是不完整的。 - Robᵩ
2
感谢您的编辑。那是不可能的;这些值已经硬编码到了json模块中(https://github.com/python/cpython/blob/master/Lib/json/encoder.py#L364)。我认为您唯一的选择是修改输出...即`replace('true', '"true"')`。 - Novel
显示剩余3条评论
1个回答

15

如果是我,我会将Python数据结构转换为所需格式,然后调用json.dumps()函数:

import json
import sys

def convert(obj):
    if isinstance(obj, bool):
        return str(obj).lower()
    if isinstance(obj, (list, tuple)):
        return [convert(item) for item in obj]
    if isinstance(obj, dict):
        return {convert(key):convert(value) for key, value in obj.items()}
    return obj

dct = {
  "is_open": True
}
print (json.dumps(dct))
print (json.dumps(convert(dct)))

输出:

{"is_open": true}
{"is_open": "true"}

为了使Python表达式{True: "yellow"}变成JSON文档{"true": "yellow"}。你的问题并没有限制转换需求仅限于字典值。 - Robᵩ
1
与其检查 listtupleisinstance,您可能正在寻找 collections.Sequence(PY27)/ collections.abc.Sequence(PY33+),甚至是 collections.Sized / collections.abc.Sized;而与其使用 dict,您可能想要使用 collections.Mapping / collections.abc.Mapping... - cowbert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接