在Python中漂亮地打印JSON.dump 2d数组

在Python中漂亮地打印JSON.dump 2d数组,python,json,multidimensional-array,pretty-print,Python,Json,Multidimensional Array,Pretty Print,我正在编写python平铺贴图编辑器。我使用自行设计的代码编写和解析一些文件,但代码非常混乱,因此为了简单起见,我切换到JSON 我的json文件是手工制作的,如下所示: { "Level" : { "levelName": "simpleLevel", "background": [[12, 2,12, 2, 1, 2, 3, 3, 1, 1], [ 1, 1, 7, 8, 5, 6, 7, 8,12, 3],

我正在编写python平铺贴图编辑器。我使用自行设计的代码编写和解析一些文件,但代码非常混乱,因此为了简单起见,我切换到JSON

我的json文件是手工制作的,如下所示:

{ "Level" :

     {

    "levelName": "simpleLevel",

    "background":   [[12, 2,12, 2, 1, 2, 3, 3, 1, 1],
                     [ 1, 1, 7, 8, 5, 6, 7, 8,12, 3],
                     [ 1, 3, 1, 3,12,10,10, 1,12,12],
                     [ 2,12, 0, 4,10, 3,12, 2,12,12],
                     [12,12, 1, 1,10, 3,12, 2,12, 1],
                     [12,12,12, 0,10, 2, 1,12, 1,12],
                     [ 3,12, 3,12, 0, 2, 2,12,12, 3],
                     [ 1,12, 1,12, 1, 1,12,12, 3,12],
                     [ 3,12, 0,12,12,12,12,12, 3, 3],
                     [12, 3, 1, 2, 3,12,12,12, 1,12]],

    "foreground":   [[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                     [ 0, 2, 0, 0, 0, 0, 0, 0, 0, 0],
                     [ 0, 3, 0, 0, 0, 0, 0, 0, 0, 0],
                     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
    }
}
但是,当我使用
json.dump(self.x,f)
时,我的输出在一行中,当我尝试使用这些参数
sort_keys=True,indent=4,separator=(',',':')
时,我得到了一千行提要

我只是想要一些与我的手工文件相似的东西,因为它更容易阅读和手工编辑。我可以找到一些简单阵列的解决方案,但对2d阵列没有任何效果。是否有一个简单的答案,或者我应该自己编写代码

编辑:

我自己编写代码(在网络的帮助下…)

用途是:

fwriteKeyVals(x, f)
其中
x=json.load(f)
f
是我加载的文件
f=open(map,“wb”)

您应该检查一下,一个用于Python数据结构的Python模块。以下代码应为您提供所需的打印:

# x -> your json dict
import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(x)

好的,我自己编的。一些用于打印而不是实际换行的黑客

def fwriteKeyVals(data, f, indent=0):
    if isinstance(data, list):
        try:
            gotdata = isinstance(data[0], list)
        except IndexError:
            gotdata = False

        if gotdata:

            f.write( "\n" + "    " * indent + "[" )  
            for i in range(len(data) ):  
                if ( i == 0):
                    f.write( "[" )  
                else:
                    f.write( "    " * indent + " [" )
                for j in range(len(data[0])):  
                    f.write( "%3d" % data[i][j] )  
                    f.write( "," ) if j != len(data[0])-1 else (f.write( "]," ) if i != len(data)-1 else f.write( "]" ))  
                f.write( "\n" ) if i != len(data)-1 else f.write( "]" )  
        else:
            try:
                gotdata = data[0]
            except IndexError:
                gotdata = 'False'

            if gotdata is not 'False':
                f.write( " [" ) 
                for i in range(len(data) ): 
                    if isinstance(data[i], Number):
                        f.write( "%3d" % data[i] )   
                    else:
                        dataListLf = data[i].split("\n")
                        dataToWrite = dataListLf[0]
                        for line in dataListLf[1:]:
                            dataToWrite += '\\n'+line

                        f.write( "\"" + dataToWrite + "\"")
                    f.write( "," ) if i != len(data)-1 else f.write( "]" )
            else:
                f.write( " [\"\"]" )

如果你只做了
indent=4
(不带
分隔符
),你应该会得到与你想要的东西非常相似的东西;这是一个电脑游戏中的手工关卡,我已经制作了很多关卡,现在我决定制作一个合适的关卡编辑器,因为仅仅根据数字矩阵进行关卡设计很烦人,但如果需要的话,我仍然希望有这个选项可用。我也是Python的新手-游戏是html5+js。我的pprint中有奇怪的
u
字母,它也有两个错误:在
“Level”之后没有新行:
,并且在矩阵中没有使用固定数量的字符,使得第一个矩阵比第二个矩阵更难阅读,它至少能显示左手零吗
f=open('simpleLevel.json',“rb”)import json x=json.load(f)f.close()import pprint pp=pprint.PrettyPrinter(indent=4)pp.pprint(x){u'Level':{u'background':[[12,2,12,2,1,2,3,1,1],[1,1,7,8,5,6,7,8,12,3],…
u字母是字符的unicode编码(例如,您得到的不是
level
,而是
u'level'
)。如果是这种情况,请删除unicode编码。关于缩进,它在逗号和数字之间留出一个空格。这是合理的,我看不出有任何理由使事情过于复杂。你说的“左手零”是什么意思?@Belphegor-我想他希望0左对齐。老实说,在这一点上,可能更容易做到编写自己的格式化程序。这是一个非常简单的递归问题。@sapi我现在正在这样做……我真的认为有更好的方法可用。
def fwriteKeyVals(data, f, indent=0):
    if isinstance(data, list):
        try:
            gotdata = isinstance(data[0], list)
        except IndexError:
            gotdata = False

        if gotdata:

            f.write( "\n" + "    " * indent + "[" )  
            for i in range(len(data) ):  
                if ( i == 0):
                    f.write( "[" )  
                else:
                    f.write( "    " * indent + " [" )
                for j in range(len(data[0])):  
                    f.write( "%3d" % data[i][j] )  
                    f.write( "," ) if j != len(data[0])-1 else (f.write( "]," ) if i != len(data)-1 else f.write( "]" ))  
                f.write( "\n" ) if i != len(data)-1 else f.write( "]" )  
        else:
            try:
                gotdata = data[0]
            except IndexError:
                gotdata = 'False'

            if gotdata is not 'False':
                f.write( " [" ) 
                for i in range(len(data) ): 
                    if isinstance(data[i], Number):
                        f.write( "%3d" % data[i] )   
                    else:
                        dataListLf = data[i].split("\n")
                        dataToWrite = dataListLf[0]
                        for line in dataListLf[1:]:
                            dataToWrite += '\\n'+line

                        f.write( "\"" + dataToWrite + "\"")
                    f.write( "," ) if i != len(data)-1 else f.write( "]" )
            else:
                f.write( " [\"\"]" )