2013-04-11 12 views
7

dostałem plik .json (nazwał ją meta.json) tak:wysypisko json do YAML

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

Chciałbym przekształcić go w .yaml pliku (nazwał ją meta.yaml) jak:

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

Co zrobiłem:

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  

Ale niestety, co mam jest następujące:

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

Dlaczego?

Odpowiedz

10

pyyaml.dump() ma opcję „allow_unicode”, to domyślna to None, wszystkie znaki nie-ASCII wyjścia są uciekł . If allow_unicode = True zapisuje nieprzetworzone ciągi Unicode.

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

premia

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

yaml.dump (dane, ff, allow_unicode = True) działa! Dziękuję bardzo! – holys

2

To się zgadza. Ciągi "\ u ...." są reprezentacją Unicode twojego japońskiego? strunowy. Kiedy dekodujesz i używasz go z właściwym kodowaniem, powinno ono wyświetlać dobrze wszędzie tam, gdzie z niego korzystasz. np. strona internetowa.

Zobacz równość pomimo danych innej reprezentacji jako wyrażenie:

>>> 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

Można wykonuje konwersję pomiędzy JSON, YAML (XML) tutaj http://demono.ru/online-SDConverter/onlinePage.aspx

+0

Należy pamiętać, że [odpowiedzi dotyczące tylko łącza] (http://meta.stackoverflow.com/tags/link-only-answers/info) są odradzane, odpowiedzi SO powinny być punktem końcowym wyszukiwania rozwiązania (vs. jeszcze jeden przystanek referencji, które z czasem zanikają). Proszę rozważyć dodanie samodzielnego streszczenia tutaj, zachowując odnośnik jako odniesienie. – kleopatra

+0

, ponieważ pytanie jest wyraźnie oznaczone jako "python" i prawdopodobnie odpowiada na to rozwiązanie w kodzie, a nie w jakimś narzędziu online. dlatego musiałem go zgodzić. – mastier

6

Działa to dla mnie:

#!/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) 

Więc co robimy jest:

  1. obciążenie plik json przez json.loads
  2. json ładunki w formacie Unicode - konwersja że do łańcucha przez json.dump
  3. załadować YAML przez yaml.load
  4. zrzuć to samo w pliku przez yaml.dump - default_flow_style - True wyświetla dane w wierszu, False nie robi inline - więc masz gotowe dane do dumpowania.

dba o Unicode zgodnie How to get string objects instead of Unicode ones from JSON in Python?