Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSON python漂亮打印,带有自定义编码器到文件_Python_Json_Serialization_Pretty Print - Fatal编程技术网

JSON python漂亮打印,带有自定义编码器到文件

JSON python漂亮打印,带有自定义编码器到文件,python,json,serialization,pretty-print,Python,Json,Serialization,Pretty Print,我希望使用json库将Python字典输出到一个文件,并设置格式,使列表显示在同一行上 我曾尝试制作一个自定义编码器,并使用我在网上找到的编码器,如以下建议: 使最终代码行为: import json data = {'a':1, 'b':[1,2,3,4]} with open("data.json", 'w') as f: json.dump(data, f, indent=4, cls=CustomEncoderClass) 但是,如果我尝试使用json.dump作为文件导

我希望使用json库将Python字典输出到一个文件,并设置格式,使列表显示在同一行上

我曾尝试制作一个自定义编码器,并使用我在网上找到的编码器,如以下建议:

使最终代码行为:

import json


data = {'a':1, 'b':[1,2,3,4]}
with open("data.json", 'w') as f:
    json.dump(data, f, indent=4, cls=CustomEncoderClass)

但是,如果我尝试使用json.dump作为文件导出,而不是将json.dump(如上面的链接中所示)导出为字符串,那么这将失败。有没有一种方法可以使用自定义编码器,使其在我将数据导出到文件时工作?

json.dumps
与您的
CustomEncoderClass
一起工作?然后,您可以使用
f.write(json.dumps(…)
来编写字符串。事实上,使用
json.dumps()
的方法与使用
json.dump()的方法不同。请看我的另一个问题,它解决了一个类似的问题。@martineau谢谢,我能够从那篇文章中复制你的结果。但是,如果我将其从
NoIndent
对象更改为任何常规列表或元组
if-isinstance(obj,NoIndent)
if-isinstance(obj,(list,tuple))
,这种方法似乎不起作用。你知道为什么会这样吗?我不太清楚您的默认函数(设置对象id格式的字符串)如何替换覆盖的默认值,该默认值似乎将所有内容都封装在
iter
中。Viraj:AFAIK您无法更改
json.jsonecoder
在文档中默认支持的Python类型。在不深入所有细节的情况下,我的答案中的代码基本上是通过将
list
tuple
对象包装到自定义
NoIndent
包装类的实例中来解决这一问题,该类允许拦截对它们的处理,因为这不是表中的类型之一(这是
jsonecoder
调用其
default()
方法的唯一时间)。
json.dumps
CustomEncoderClass
一起工作?然后您可以使用
f.write(json.dumps(…)
确实,使用
json.dumps()
。请看我的另一个问题,它解决了一个类似的问题。@martineau谢谢,我能够复制你在那篇文章中的结果。但是,如果我将它从
NoIndent
对象更改为任何常规列表或元组
if isinstance(obj,NoIndent)
更改为
if isinstance(obj,(list,tuple))
。知道为什么会这样吗?我不太清楚默认函数(哪个字符串格式化对象id)替换被覆盖的默认值,该默认值似乎将所有内容都封装在
iter
中。Viraj:AFAIK您无法更改
json.jsonecoder
在文档中默认支持的Python类型方面所做的操作。在不深入所有细节的情况下,我的答案中的代码基本上是什么解决方法是将
list
tuple
对象包装在自定义
NoIndent
包装类的实例中,该包装类允许拦截对它们的处理,因为这不是表中的类型之一(这是
jsonecoder
调用其
default()
方法的唯一时间)。