2013-04-11 3 views
7

я получил .json файл (названный его meta.json), как это:дамп JSON в YAML

{ 
    "main": { 
     "title": "今日は雨が降って", 
     "description": "今日は雨が降って" 
    } 
} 

Я хотел бы, чтобы преобразовать его в .yaml файл (с именем его meta.yaml) как:

title: "今日は雨が降って" 
description: "今日は雨が降って" 

Что я сделал:

import simplejson as json 
import pyyaml 

f = open('meta.json', 'r') 
jsonData = json.load(f) 
f.close() 

ff = open('meta.yaml', 'w+') 
yamlData = {'title':'', 'description':''} 
yamlData['title'] = jsonData['main']['title'] 
yamlData['description'] = jsonData['main']['description'] 
yaml.dump(yamlData, ff) 
# So you can see that what I need is the value of meta.json  

к сожалению, я получил следующее:

{description: "\u4ECA\u65E5\u306F\u96E8\u304C\u964D\u3063\u3066", title: "\u4ECA\u65E5\ 
\u306F\u96E8\u304C\u964D\u3063"} 

Почему?

ответ

10

pyyaml.dump() имеет опцию «allow_unicode», это по умолчанию не является None, все символы не-ASCII в выводе экранируются , Если allow_unicode = True, напишите необработанные строки unicode.

yaml.dump(data, ff, allow_unicode=True) 

бонус

json.dump(data, outfile, ensure_ascii=False) 
+0

yaml.dump (данные, далее, allow_unicode = True) работает! Спасибо огромное! – holys

2

Это правильно. Строки «\ u ....» представляют собой юникодное представление вашего японца? строка. Когда вы декодируете и используете его с надлежащим кодированием, он должен отображаться в любом месте, где бы вы его ни использовали. например, веб-страницу.

См равенство Inspite данных различного представления в виде строки:

>>> import json 
>>> j = '{ "main": {  "title": "今日は雨が降って",  "description": "今日は雨が降って" }}' 
>>> s = json.loads(j) 
>>> t = json.dumps(s) 
>>> j 
'{ "main": {  "title": "\xe4\xbb\x8a\xe6\x97\xa5\xe3\x81\xaf\xe9\x9b\xa8\xe3\x81\x8c\xe9\x99\x8d\xe3\x81\xa3\xe3\x81\xa6",  "description": "\xe4\xbb\x8a\xe6\x97\xa5\xe3\x81\xaf\xe9\x9b\xa8\xe3\x81\x8c\xe9\x99\x8d\xe3\x81\xa3\xe3\x81\xa6" }}' 
>>> t 
'{"main": {"description": "\\u4eca\\u65e5\\u306f\\u96e8\\u304c\\u964d\\u3063\\u3066", "title": "\\u4eca\\u65e5\\u306f\\u96e8\\u304c\\u964d\\u3063\\u3066"}}' 
>>> s == json.loads(t) 
True 
1
In [1]: import json, yaml 

In [2]: with open('test.json') as js: 
    ...:  data = json.load(js)[u'main'] 
    ...:  

In [3]: with open('test.yaml', 'w') as yml: 
    ...:  yaml.dump(data, yml, allow_unicode=True) 
    ...:  

In [4]: ! cat test.yaml 
{!!python/unicode 'description': 今日は雨が降って, !!python/unicode 'title': 今日は雨が降って} 

In [5]: with open('test.yaml', 'w') as yml: 
    ...:  yaml.safe_dump(data, yml, allow_unicode=True) 
    ...:  

In [6]: ! cat test.yaml 
{description: 今日は雨が降って, title: 今日は雨が降って} 
-4

Вы можете выполняет преобразование между JSON, YAML (и XML) здесь http://demono.ru/online-SDConverter/onlinePage.aspx

+0

Обратите внимание, что [ссылки только ответов] (http://meta.stackoverflow.com/tags/link-only-answers/info) обескуражены, SO ответы должны быть конечной точкой поиска решения (vs. еще одна остановка ссылок, которые со временем становятся устаревшими). Пожалуйста, подумайте о добавлении отдельного резюме здесь, сохранив ссылку в качестве ссылки. – kleopatra

+0

, так как вопрос четко помечен как «python», и на него должен отвечать ответ в коде, а не какой-либо онлайн-инструмент. поэтому я должен был его понизить. – mastier

6

Это работает для меня:

#!/usr/bin/env python 
import sys 
import json 
import yaml 

print yaml.dump(yaml.load(json.dumps(json.loads(open(sys.argv[1]).read()))), default_flow_style=False) 

Итак, что мы делаем:

  1. нагрузки JSON файл через json.loads
  2. JSON нагрузок в формате Юникод - преобразовать его в строку с помощью json.dump
  3. ТЕПЛОВОЙ НАГРУЗКИ YAML через yaml.load
  4. сбрасывать то же самое в файле через yaml.dump - default_flow_style - True отображает данные inline, False не делает встроенного - так что у вас есть готовые данные.

Заботится юникодом согласно How to get string objects instead of Unicode ones from JSON in Python?