相当打印json但保持内部数组在一行python

Ben*_*ler 18 python arrays json dictionary pretty-print

我正在使用以下代码在Python中打印json:

json.dumps(json_output, indent=2, separators=(',', ': ')
Run Code Online (Sandbox Code Playgroud)

这打印我的json像:

{    
    "rows_parsed": [
        [
          "a",
          "b",
          "c",
          "d"
        ],
        [
          "e",
          "f",
          "g",
          "i"
        ],
    ]
}
Run Code Online (Sandbox Code Playgroud)

但是,我希望它打印如下:

{    
    "rows_parsed": [
        ["a","b","c","d"],
        ["e","f","g","i"],
    ]
}
Run Code Online (Sandbox Code Playgroud)

如何将数组中的数组全部保存在一行上?

Mar*_*gov 5

这是一种以尽可能少的修改来完成此操作的方法:

import json
from json import JSONEncoder
import re

class MarkedList:
    _list = None
    def __init__(self, l):
        self._list = l

z = {    
    "rows_parsed": [
        MarkedList([
          "a",
          "b",
          "c",
          "d"
        ]),
        MarkedList([
          "e",
          "f",
          "g",
          "i"
        ]),
    ]
}

class CustomJSONEncoder(JSONEncoder):
    def default(self, o):
        if isinstance(o, MarkedList):
            return "##<{}>##".format(o._list)

b = json.dumps(z, indent=2, separators=(',', ':'), cls=CustomJSONEncoder)
b = b.replace('"##<', "").replace('>##"', "")

print(b)
Run Code Online (Sandbox Code Playgroud)

基本上,您想要以您创建实例的方式格式化的列表 MarkedList,它们被解析为字符串,希望具有足够唯一的序列,稍后从 的输出中删除dumps。这样做是为了消除 json 字符串周围的引号。

另一种更有效的方法,但更难看的方法是使用 json.encoder._make_iterencode._iterencode以下内容进行猴子修补:

def _iterencode(o, _current_indent_level):
    if isinstance(o, str):
        yield _encoder(o)
    elif o is None:
        yield 'null'
    elif o is True:
        yield 'true'
    elif o is False:
        yield 'false'
    elif isinstance(o, int):
        # see comment for int/float in _make_iterencode
        yield _intstr(o)
    elif isinstance(o, float):
        # see comment for int/float in _make_iterencode
        yield _floatstr(o)
    elif isinstance(o, MarkedList):
        yield _my_custom_parsing(o)
    elif isinstance(o, (list, tuple)):
        yield from _iterencode_list(o, _current_indent_level)
    elif isinstance(o, dict):
        yield from _iterencode_dict(o, _current_indent_level)
    else:
        if markers is not None:
            markerid = id(o)
            if markerid in markers:
                raise ValueError("Circular reference detected")
            markers[markerid] = o
        o = _default(o)
        yield from _iterencode(o, _current_indent_level)
        if markers is not None:
            del markers[markerid]
Run Code Online (Sandbox Code Playgroud)