2012-04-10 4 views
9

У меня есть большой словарь, который имеет некоторые большие массивы данных в нем:питон JSON массив новой строки

d = {'something': {'else': 'x'}, 'longnumbers': [1,2,3,4,54,6,67,7,7,8,8,8,6,4,3,3,5,6,7,4,3,5,6,54]} 

Реальный словарь имеет много больше ключей и вложенную структуру. Когда я использую json.dump без indent, я получаю компактный однострочный вывод, который не читается. Когда я устанавливаю indent, он помещает символы новой строки после каждого разделителя, включая массивы.

Числовые массивы долго и в конечном итоге, как это:

"longnumbers": [ 
    1, 
    2, 
    3, 
    4, 
    54, 
    6, 
    67, 
    7, 
    7, 
    8, 
    8, 
    8, 
    6, 
    4, 
    3, 
    3, 
    5, 
    6, 
    7, 
    4, 
    3, 
    5, 
    6, 
    54 
    ], 

Есть ли способ, чтобы получить довольно-печатное JSON с уровнем отступа, но без размещения новой строки после элементов массива? Для приведенного выше примера, я хотел бы что-то вроде этого:

{ 
    "longnumbers": [1, 2, 3, 4, 54, 6, 67, 7, 7, 8, 8, 8, 6, 4, 3, 3, 5, 6, 7, 4, 3, 5, 6, 54], 
    "something": { 
    "else": "x" 
    } 
} 
+1

Вы, скорее всего, нужно закодировать это самостоятельно. –

+0

Вот чего я боялся – jterrace

+0

@NiklasB. это тот вывод, к которому я пришел, когда у меня была аналогичная проблема. К счастью, библиотека 'json' реализована на Python, и особенно трудно читать, что обеспечивает хорошую основу для вещей. –

ответ

8

Я кончался только писать свой собственный формат JSON сериализатор:

import numpy 

INDENT = 3 
SPACE = " " 
NEWLINE = "\n" 

def to_json(o, level=0): 
    ret = "" 
    if isinstance(o, dict): 
     ret += "{" + NEWLINE 
     comma = "" 
     for k,v in o.iteritems(): 
      ret += comma 
      comma = ",\n" 
      ret += SPACE * INDENT * (level+1) 
      ret += '"' + str(k) + '":' + SPACE 
      ret += to_json(v, level + 1) 

     ret += NEWLINE + SPACE * INDENT * level + "}" 
    elif isinstance(o, basestring): 
     ret += '"' + o + '"' 
    elif isinstance(o, list): 
     ret += "[" + ",".join([to_json(e, level+1) for e in o]) + "]" 
    elif isinstance(o, bool): 
     ret += "true" if o else "false" 
    elif isinstance(o, int): 
     ret += str(o) 
    elif isinstance(o, float): 
     ret += '%.7g' % o 
    elif isinstance(o, numpy.ndarray) and numpy.issubdtype(o.dtype, numpy.integer): 
     ret += "[" + ','.join(map(str, o.flatten().tolist())) + "]" 
    elif isinstance(o, numpy.ndarray) and numpy.issubdtype(o.dtype, numpy.inexact): 
     ret += "[" + ','.join(map(lambda x: '%.7g' % x, o.flatten().tolist())) + "]" 
    elif o is None: 
     ret += 'null' 
    else: 
     raise TypeError("Unknown type '%s' for json serialization" % str(type(o))) 
    return ret 
+0

Эта функция бесплатна для использования под лицензией BSD. – jterrace

+0

Этот ответ спас мой день! – soulmachine

Смежные вопросы