2013-04-11 24 views
7

tôi nhận được một tập tin .json (đặt tên nó meta.json) như thế này:bãi json vào yaml

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

Tôi muốn chuyển đổi nó vào một tập tin .yaml (đặt tên nó meta.yaml) như:

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

Những gì tôi đã làm là:

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  

Nhưng thật đáng buồn, những gì tôi nhận được là:

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

Tại sao?

Trả lời

10

pyyaml.dump() có "allow_unicode" tùy chọn, nó mặc định là None, tất cả các ký tự khác ASCII trong đầu ra đang trốn thoát . Nếu allow_unicode = True viết chuỗi unicode thô.

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

thưởng

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

yaml.dump (dữ liệu, ff, allow_unicode = True) hoạt động! Cảm ơn bạn rất nhiều! – holys

2

Điều này là chính xác. Các chuỗi "\ u ...." là đại diện unicode của tiếng Nhật của bạn? chuỗi. Khi bạn giải mã và sử dụng nó với mã hóa thích hợp, nó sẽ hiển thị tốt bất cứ nơi nào bạn sử dụng nó. ví dụ: trang web.

Xem sự bình đẳng giữa Mặc dù có dữ liệu đại diện khác nhau như chuỗi:

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

Bạn có thể thực hiện chuyển đổi giữa json, YAML (và xml) ở đây http://demono.ru/online-SDConverter/onlinePage.aspx

+0

Lưu ý rằng [câu trả lời chỉ có liên kết] (http://meta.stackoverflow.com/tags/link-only-answers/info) không được khuyến khích, các câu trả lời SO phải là điểm cuối của việc tìm kiếm giải pháp (so với nhưng một điểm dừng khác của tài liệu tham khảo, mà có xu hướng để có được cũ theo thời gian). Vui lòng xem xét thêm bản tóm tắt độc lập tại đây, giữ liên kết dưới dạng tham chiếu. – kleopatra

+0

là câu hỏi được gắn thẻ rõ ràng 'python' và được cho là được trả lời bằng giải pháp trong mã chứ không phải một số công cụ trực tuyến. do đó tôi phải downvote nó. – mastier

6

này làm việc cho tôi:

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

Vì vậy, những gì chúng ta đang làm là:

  1. tải tệp json qua json.loads
  2. json tải ở định dạng unicode - chuyển đổi đó để chuỗi bởi json.dump
  3. tải các yaml qua yaml.load
  4. đưa cùng một tệp vào trong một tệp thông qua yaml.dump - default_flow_style - True hiển thị dữ liệu nội dòng, False không làm nội dòng - vì vậy bạn có sẵn sàng dữ liệu có thể bán được.

Đưa sóc unicode theo How to get string objects instead of Unicode ones from JSON in Python?