2017-02-23 4 views
2

私は素晴らしい方法でJsonを印刷したい、私は大括弧、引用符と中括弧を取り除き、インデントと行末を使ってjsonを表示したい構造。例えばPythonで、かっこと中かっこを取り除いてJsonを印刷するには

私はこのようなJSONを持っている場合:私は、{除去することにより、JSONを印刷することができる方法

{ 
     "A": { 
      "A1": 1, 
      "A2": 2 
     }, 
     "B": { 
      "B1": { 
       "B11": { 
        "B111": 1, 
        "B112": 2 
       }, 
       "B12": { 
        "B121": 1, 
        "B122": 2 
       } 
      }, 
      "B2": { 
       "B21": [1,2], 
       "B22": [1,2] 
      } 
     }, 
     "C": "CC" 
    } 

}と[]、私がしたいことは次のとおりです。

A: 
    A1: 1 
    A2: 2 
B: 
    B1: 
    B11: 
     B111: 1 
     B112: 2 
    B12: 
     B121: 1 
     B122: 2 
    B2: 
    B21: 1, 2 
    B22: 1, 2 
C: CC 
+3

を出力形式は、おそらくあなたはそれを使用することができ、ビット[YAML](http://www.yaml.org/)のようになっていること? – Blckknght

答えて

5

あなたは読み込むことができますjsonをPythonオブジェクトに変換し、PythonオブジェクトをYAMLに変換します。もう1つの解決策は、辞書を繰り返し、必要に応じてフォーマットすることです。

これをYAMLに変換する例を示します。それはあなたが望むものを正確に与えるわけではありませんが、かなり近いです。出力をカスタマイズする方法はたくさんありますが、これは一般的な考え方を示すためだけの迅速なハックです:

import json 
import yaml 

data = json.loads(''' 
    { 
     "A": { 
      "A1": 1, 
      "A2": 2 
     }, 
     "B": { 
      "B1": { 
       "B11": { 
        "B111": 1, 
        "B112": 2 
       }, 
       "B12": { 
        "B121": 1, 
        "B122": 2 
       } 
      }, 
      "B2": { 
       "B21": [1,2], 
       "B22": [1,2] 
      } 
     }, 
     "C": "CC" 
    } 
''') 

print yaml.safe_dump(data, allow_unicode=True, default_flow_style=False) 

これは、出力は私が取得:偶然あなたがそれをしたい場合は

A: 
    A1: 1 
    A2: 2 
B: 
    B1: 
    B11: 
     B111: 1 
     B112: 2 
    B12: 
     B121: 1 
     B122: 2 
    B2: 
    B21: 
    - 1 
    - 2 
    B22: 
    - 1 
    - 2 
C: CC 
+0

ブライアンありがとう、これは私が欲しいものです。別の質問があります。私はJsonをyamlに変換できる方法はありますか?私はなぜyamlにpythonオブジェクトを変換すると命令(dictのキー)が破られるが、YamlはOrderedDictをサポートしていないようだから尋ねる理由がある。ですから、もし私ができるならば、私は思っています:キーの順序を保つために、python object-> Json then Json-> yaml。 – yabchexu

+1

@yabchexu:これで問題は解決しますか? http://stackoverflow.com/q/6921699/7432 –

+0

はい!本当にありがとう! – yabchexu

1

をとあなたの最初に指定した形式で、あなたは、必要に応じてカスタマイズすることPyYAMLとクラス構造をオーバーロードすることができます

コード:

import yaml 
from yaml.emitter import Emitter 
from yaml.serializer import Serializer 
from yaml.representer import Representer 
from yaml.resolver import Resolver 

class MyRepresenter(Representer): 

    def represent_sequence(self, tag, sequence, flow_style=None): 
     value = [] 
     node = yaml.SequenceNode(tag, value, flow_style=flow_style) 
     if self.alias_key is not None: 
      self.represented_objects[self.alias_key] = node 
     best_style = True 
     for item in sequence: 
      node_item = self.represent_data(item) 
      if not (isinstance(node_item, yaml.ScalarNode) and 
        not node_item.style): 
       best_style = False 
      value.append(node_item) 
     if best_style: 
      node = self.represent_data(
       str(', '.join('%s' % x.value for x in value))) 
     if flow_style is None: 
      if self.default_flow_style is not None: 
       node.flow_style = self.default_flow_style 
      else: 
       node.flow_style = best_style 
     return node 

class MyDumper(Emitter, Serializer, MyRepresenter, Resolver): 

    def __init__(self, stream, 
      default_style=None, default_flow_style=None, 
      canonical=None, indent=None, width=None, 
      allow_unicode=None, line_break=None, 
      encoding=None, explicit_start=None, explicit_end=None, 
      version=None, tags=None): 
     Emitter.__init__(self, stream, canonical=canonical, 
       indent=indent, width=width, 
       allow_unicode=allow_unicode, line_break=line_break) 
     Serializer.__init__(self, encoding=encoding, 
       explicit_start=explicit_start, explicit_end=explicit_end, 
       version=version, tags=tags) 
     MyRepresenter.__init__(self, default_style=default_style, 
       default_flow_style=default_flow_style) 
     Resolver.__init__(self) 

print yaml.dump(data, Dumper=MyDumper, default_flow_style=False) 

を生成します:

A: 
    A1: 1 
    A2: 2 
B: 
    B1: 
    B11: 
     B111: 1 
     B112: 2 
    B12: 
     B121: 1 
     B122: 2 
    B2: 
    B21: 1, 2 
    B22: 1, 2 
C: CC 
関連する問題