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)
如何将数组中的数组全部保存在一行上?
这是一种以尽可能少的修改来完成此操作的方法:
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)