所以我使用 Python 2.7,使用 json
模块来编码以下数据结构:
'layer1': {
'layer2': {
'layer3_1': [ long_list_of_stuff ],
'layer3_2': 'string'
}
}
我的问题是我正在使用漂亮的打印打印出所有内容,如下所示:
json.dumps(data_structure, indent=2)
这很好,除了我想全部缩进,除了 "layer3_1"
中的内容——这是一个巨大的字典列表坐标,因此,在每个坐标上设置一个值使得漂亮的打印创建一个文件有数千行,示例如下:
{
"layer1": {
"layer2": {
"layer3_1": [
{
"x": 1,
"y": 7
},
{
"x": 0,
"y": 4
},
{
"x": 5,
"y": 3
},
{
"x": 6,
"y": 9
}
],
"layer3_2": "string"
}
}
}
我真正想要的是类似于以下内容的内容:
{
"layer1": {
"layer2": {
"layer3_1": [{"x":1,"y":7},{"x":0,"y":4},{"x":5,"y":3},{"x":6,"y":9}],
"layer3_2": "string"
}
}
}
我听说可以扩展 json
模块:是否可以将其设置为仅在 "layer3_1"
对象内部时关闭缩进?如果是这样,有人会告诉我怎么做吗?
原文由 Rohaq 发布,翻译遵循 CC BY-SA 4.0 许可协议
( 注意: 此答案中的代码仅适用于
json.dumps()
返回 JSON 格式的字符串,但 不适 用于json.dump()
直接写入类似文件的对象。它有一个修改版本在我对 Write two-dimensional list to JSON file 这个问题的回答中,两者都适用。)更新
以下是我的原始答案的一个版本,该版本已经过多次修改。与原始版本不同,我发布它只是为了展示如何让 JFSebastian 的 回答 中的第一个想法起作用,并且与他的一样,它返回了对象的非缩进 字符串 表示形式。最新更新版本返回隔离格式化的 Python 对象 JSON。
每个坐标的键
dict
将按照 OP 的评论之一按排序顺序出现,但前提是sort_keys=True
关键字参数在初始json.dumps()
调用驱动过程,它不再沿途将对象的类型更改为字符串。换句话说,现在保留了“包装”对象的实际类型。我认为不理解我帖子的初衷会导致很多人对其投反对票——因此,主要是出于这个原因,我多次“修复”并改进了我的答案。当前版本是我的原始答案的混合体,加上@Erik Allik 在他的 答案 中使用的一些想法,以及该答案下方评论中显示的其他用户的有用反馈。
以下代码似乎在 Python 2.7.16 和 3.7.4 中都可以正常工作。
输出: