次のような.json
ファイル(meta.json
という名前)を取得しました。
{
"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"}
どうして?
pyyaml.dump()には「allow_unicode」オプションがあり、デフォルトはNoneです。出力の非ASCII文字はすべてエスケープされます。 allow_unicode = Trueの場合、未加工のUnicode文字列を書き込みます。
yaml.dump(data, ff, allow_unicode=True)
ボーナス
json.dump(data, outfile, ensure_ascii=False)
これは私にとってはうまくいきます:
#!/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)
だから私たちがしていることは:
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: 今日は雨が降って}
これは正しいです。 "\ u ...."文字列はあなたの日本語のユニコード表現ですか?ストリング。適切なエンコーディングでデコードして使用すると、どこで使用しても問題なく表示されるはずです。例:ウェブページ。
文字列としての異なる表現にもかかわらず、データの同等性を見てください:
>>> 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