2013-04-11 94 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”选项,它的默认设置为无, 输出中的所有非ASCII字符转义。如果allow_unicode = True,则写入原始unicode字符串。

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

奖金

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

yaml.dump(数据,FF,allow_unicode =真)的作品!非常感谢! – holys 2013-04-11 06:54:03

2

这是正确的。 “\ u ....”字符串是您的日语的unicode表示形式吗?串。当你使用正确的编码进行解码和使用时,无论你在哪里使用它,它都应该显示得很好。例如网页。

见不同的表示的数据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)不鼓励,所以答案应该是搜索解决方案的终点(vs.而另一个引用的中途停留时间往往会随着时间推移而过时)。请考虑在此添加独立的摘要,并将链接保留为参考。 – kleopatra 2013-09-07 10:20:59

+0

作为问题显然标记为'python',应该通过代码解决方案来回答,而不是一些在线工具。因此我不得不倒退它。 – mastier 2017-05-15 15:40:06

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) 

所以我们正在做的是:通过json.loads

  • JSON负载Unicode格式

    1. 负荷JSON文件 - 将其转换成字符串的那样json.dump
    2. 负荷YAML通过yaml.load
    3. 通过yaml.dump转储文件中的相同内容 - default_flow_style - True显示数据内联,False不执行内联 - 因此您已准备好可以抽取的数据。

    照顾统一的按How to get string objects instead of Unicode ones from JSON in Python?