24

我有一个像这样的.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"}

为什么?

4

5 回答 5

31

pyyaml.dump() 具有“allow_unicode”选项,默认为 None,输出中的所有非 ASCII 字符都被转义。如果 allow_unicode=True 写入原始 unicode 字符串。

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

奖金

json.dump(data, outfile, ensure_ascii=False)
于 2013-04-11T06:48:15.783 回答
15

这对我有用:

#!/usr/bin/env python

import sys
import json
import yaml

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

所以我们正在做的是:

  1. 通过 json.loads 加载 json 文件
  2. json 以 unicode 格式加载 - 通过 json.dump 将其转换为字符串
  3. 通过 yaml.load 加载 yaml
  4. 通过 yaml.dump 在文件中转储相同的内容 - default_flow_style - True 内联显示数据,False 不内联 - 因此您已准备好可转储数据。

根据如何从 JSON 中获取字符串对象而不是 Unicode 来处理 unicode?

于 2015-02-13T18:12:51.773 回答
3
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: 今日は雨が降って}
于 2013-04-11T06:48:36.193 回答
2

这是对的。"\u...." 字符串是你的日语的 unicode 表示?细绳。当您解码并使用正确的编码时,无论您使用它,它都应该显示良好。例如网页。

尽管字符串表示形式不同,但请查看数据的相等性:

>>> 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
于 2013-04-11T06:32:36.970 回答
2

我做的很简单:

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

yaml.safe_dump(json.load(sys.stdin), sys.stdout, default_flow_style=False)
于 2020-07-14T21:05:51.723 回答