2013-05-01 1 views
12

Всякий раз, когда я пытаюсь распечатать json из python, он игнорирует разрывы строк и печатает буквальную строку «\ n» вместо новых символов строки.Не удается напечатать json из python

Я генерирую json используя jinja2. Вот мой код:

print json.dumps(template.render(**self.config['templates'][name])) 

Он печатает все в блоке ниже (буквально - даже цитаты и "\ п" струны):

"{\n \"AWSTemplateFormatVersion\" : \"2010-09-09\",\n \"Description\" : ... 

(укороченный)

я получаю что-то например, всякий раз, когда я пытаюсь свалить что-либо, кроме диктата. Даже если я попробую json.loads(), то сбрасываю его снова, я получаю мусор. Он просто удаляет все разрывы строк.

Что случилось?

ответ

17

Это то, что я использую для довольно-полиграфических JSon-объекты:

def get_pretty_print(json_object): 
    return json.dumps(json_object, sort_keys=True, indent=4, separators=(',', ': ')) 

print get_pretty_print(my_json_obj) 

json.dumps() также принимает параметры для кодирования, если вам нужна поддержка без ascii.

+2

Нет, это не сработает. Он не решает проблему с тем, что «print» на самом деле печатает «\ n» вместо новых символов строки. – user1491250

+2

Он работает, если использовать JSON-_object_ (или, скорее, dict в python) в качестве входа для 'json.dumps()'. Если у вас уже есть JSON-объект, представленный как строка, вам больше не нужно 'json.dumps()'. – felixbr

+0

если я запустил 'dat = json.loads (payload.content)' где 'type (payload)' is '' и 'type (dat)' is '', 'json.dumps (dat, indent = 4)' все еще показывает символы '\ n' в выводе консоли, а' json.dumps (payload.content, indent = 4) 'показывает количество символов' \\ 'и нет отступы. Я что-то упустил? EDIT: да, похоже, мне пришлось делать 'print (json.dumps (dat, indent = 4))', чтобы заставить его работать в сеансе интерактивной консоли. – user5359531

7

json.dumps() возвращает строку, закодированную в JSON. Стандартные мандаты JSON, что новые строки закодированы в \\n, который затем напечатанные в \n:

>>> s="""hello 
... there""" 
>>> s 
'hello\nthere' 
>>> json.dumps(s) 
'"hello\\nthere"' 
>>> print(json.dumps(s)) 
"hello\nthere" 

Там не много вы можете сделать, чтобы изменить это, если вы хотите сохранить правильную строку JSON. Если вы хотите, чтобы распечатать его, правильный путь будет печатать объект JSON , а не его строковое представление:

>>> print(s) 
hello 
there 
>>> print(json.loads(json.dumps(s))) # pointless; just for demonstration... 
hello 
there 
+0

Я знаю. Как заставить json.dumps возвращать новые строковые символы вместо литерала или как сделать печать интерполировать их вместо печати литерала? – user1491250

+0

@ пользователь1491250: You * нет * распечатан еще. Если бы у вас было, разрывы строк были бы видны. У вас есть оболочка Python, отображающая возвращаемое значение, и это делается с помощью 'repr' строки. –

+0

обновлен. да. проблема заключается в том, что печать печатает буквальную строку «\ n» вместо новых строк. вот почему я спрашиваю. – user1491250

0

Если строка уже JSON, то довольно распечатать его с помощью

def pp_json(json_string): 
# converts json to dict then back to string... ridiculous but not pointless 
    print(json.dumps(json.loads(json_string), sort_keys=True, indent=4)) 
    return 

pp_json(your_json_string) 
0

проблема заключается в том, что ваш вклад в json.dumps является string. Попробуйте следующее:

print type(template.render(**self.config['templates'][name])) 

Это вы делаете это, чтобы отступы и т.д. ... попробуйте следующее:

print json.dumps(json.loads(template.render(**self.config['templates'][name])), sort_keys=True, indent=4) 
Смежные вопросы