web-dev-qa-db-fra.com

vider json dans yaml

J'ai un .json fichier (nommé meta.json) comme ça:

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

Je voudrais le convertir en .yaml fichier (nommé meta.yaml) comme :

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

Ce que j'ai fait, c'est:

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     

Mais malheureusement, ce que j'ai obtenu est le suivant:

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

Pourquoi?

16
holys

pyyaml.dump () a l'option "allow_unicode", sa valeur par défaut est None, tous les caractères non ASCII dans la sortie sont échappés. Si allow_unicode = True, écrivez des chaînes Unicode brutes.

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

prime

json.dump(data, outfile, ensure_ascii=False)
22
shoma

Cela fonctionne pour moi:

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

Donc ce que nous faisons c'est:

  1. charger le fichier json via json.loads
  2. json se charge au format unicode - convertissez-le en chaîne par json.dump
  3. charger le yaml via yaml.load
  4. vider la même chose dans un fichier via yaml.dump - default_flow_style - True affiche les données en ligne, False ne le fait pas en ligne - vous avez donc des données dumpables prêtes.

Prend soin de l'unicode selon Comment obtenir des objets chaîne au lieu de ceux Unicode de JSON en Python?

11
Saurabh Hirani
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: 今日は雨が降って}
2
root

C'est correct. Les chaînes "\ u ...." sont une représentation unicode de votre japonais? chaîne. Lorsque vous le décodez et l'utilisez avec un encodage approprié, il devrait s'afficher correctement où que vous l'utilisiez. par exemple une page Web.

Voir l'égalité des données malgré une représentation différente sous forme de chaîne:

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