【发布时间】:2016-10-13 18:50:10
【问题描述】:
考虑以下代码:
>>> import json
>>> data = {
... 'x': [1, {'$special': 'a'}, 2],
... 'y': {'$special': 'b'},
... 'z': {'p': True, 'q': False}
... }
>>> print(json.dumps(data, indent=2))
{
"y": {
"$special": "b"
},
"z": {
"q": false,
"p": true
},
"x": [
1,
{
"$special": "a"
},
2
]
}
我想要的是格式化 JSON,以便将只有一个属性 '$special' 的 JSON 对象呈现在一行上,如下所示。
{
"y": {"$special": "b"},
"z": {
"q": false,
"p": true
},
"x": [
1,
{"$special": "a"},
2
]
}
我已经尝试过实现自定义 JSONEncoder 并将其作为 cls 参数传递给 json.dumps,但是 JSONEncoder 上的两种方法都有问题:
JSONEncoderdefault方法为data的每个部分调用,但返回值不是原始 JSON 字符串,因此似乎没有任何方法可以调整其格式。JSONEncoderencode方法确实返回一个原始 JSON 字符串,但它只对整个data调用一次。
有什么方法可以让JSONEncoder 做我想做的事吗?
【问题讨论】:
-
为什么首先需要这个?
json模块并没有真正设置为让您在该程度上控制输出格式。 -
另外,当
"$special"存在时,它是否保证是唯一的键? -
@MartijnPieters 我想在面向开发人员的 UI 中显示 JSON 数据。
{'$special': 'some key'}形式的 JSON 对象在这个 JSON 数据中大量出现,所以我只是在探索视觉上压缩它的可能性。可以假设'$special'是唯一存在的键,尽管我认为这与我真正要问的问题是正交的:如何在本地修改 JSON 格式。答案可能很简单:“你不能使用json模块。” -
我自己尝试做一些与此非常相似的事情,但在
JSONEncoder中没有骰子。我最终只是放弃了战斗并使用标准的美化。 -
我真的希望能找到类似yapf 的东西,但用于格式化 json,最好是作为 Python 库。不过我还没有找到。
标签: python json python-3.x formatting