在Python中美观地打印JSON格式的二维数组

2 投票
2 回答
2477 浏览
提问于 2025-04-18 16:29

我正在写一个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, separators=(',', ': ') 时,结果却出现了成千上万的换行符……

我只是想要一个和我手动制作的文件类似的格式,因为那样更容易阅读和手动编辑。我找到了一些处理简单数组的解决方案,但对于二维数组却没有找到有效的方法。有没有简单的解决办法,还是我得自己写代码?

补充:

我自己写了代码(也参考了一些网上的资料……)

def fwriteKeyVals(data, f, indent=0):
    if isinstance(data, list):
        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( "]" )  
    elif isinstance(data, dict):
        f.write( "\n" + "    " * indent + "{" )
        for k, v in data.iteritems():
            f.write( "\n" + "    " * indent + "\"" + k + "\"" + ": ")
            fwriteKeyVals(v, f, indent + 1)
            if( data.keys()[-1] != k):
                 f.write( "," )
        f.write( "\n" + "    " * indent + "}" )
    else:
        f.write("\"" + data + "\"")

使用方法是:

fwriteKeyVals(x, f)

其中 x = json.load(f),而 f 是我用 f = open(map, "wb") 打开的文件。

2 个回答

0

好的,我自己写了代码。有一些小技巧可以让它打印出 \n 而不是实际的换行符。

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( " [\"\"]" )

撰写回答