2017-10-25 6 views
0

私のjsonファイルは辞書形式です。私はそれを私のPythonに読み込みたいと思います。これは私の元のファイルです。python:json辞書を間違った形式で読む

fruit.json:

{ 
    "Q":"Is it red?", 
    "yes":{ 
     "answer":"apple" 
    }, 
    "no":{ 
     "Q":"Is it yellow", 
     "yes":{ 
      "answer":"banana" 
     }, 
     "no":{ 
      "Q":"Is it sweet?", 
      "yes":{ 
       "answer":"mango" 
      }, 
      "no":{ 
       "Q":"Bigger than strawberry?", 
       "yes":{ 
        "answer":"lemon" 
       }, 
       "no":{ 
        "answer":"blueberry" 
       } 
      } 
     } 
    } 
} 

それらを読んだ後、私はそれがあまりにも同じ形式でそれらを印刷することが可能かどうかを知りたいです。

コード:秒の

import json 
    import sys 


    s = json.loads(open(r'C:\Users\makiyo\fruit.json').read()) 
    print(s) 
    print(type(s)) 
    print("--------") 
    print(json.dumps(s, indent=4), file=sys.stderr) 

タイプは辞書です:

{'Q': 'Is it red?', 'no': {'Q': 'Is it yellow', 'no': {'Q': 'Is it sweet?', 'no': {'Q': 'Bigger than strawberry?', 'no': {'answer': 'blueberry'}, 'yes': {'answer': 'lemon'}}, 'yes': {'answer': 'mango'}}, 'yes': {'answer': 'banana'}}, 'yes': {'answer': 'apple'}} 

出力:

{ 
    "Q": "Is it red?", 
    "no": { 
     "Q": "Is it yellow", 
     "no": { 
      "Q": "Is it sweet?", 
      "no": { 
       "Q": "Bigger than strawberry?", 
       "no": { 
        "answer": "blueberry" 
       }, 
       "yes": { 
        "answer": "lemon" 
       } 
      }, 
      "yes": { 
       "answer": "mango" 
      } 
     }, 
     "yes": { 
      "answer": "banana" 
     } 
    }, 
    "yes": { 
     "answer": "apple" 
    } 
} 

これはfruit.jsonから形式ではありません、私はしないでくださいこのように「はい」/「いいえ」の場所を変更する理由を知ってください。

答えて

1

何も変更しない場合は、JSONに解析する文字列への参照を保持することです。

with open(r'C:\Users\makiyo\fruit.json') as input_file: 
    raw = input_file.read() 
    s = json.loads(raw) 
    assert type(raw) is str 
    assert type(s) is dict 

あなたが参照に保持するために、またはあなたが辞書を編集したい場合は、あなたがjson.dumpsを使用することができますしたくない場合。

output = json.dumps(s) 
assert type(output) is str 
+0

を!しかし、私はまだこれと一緒に動作する理由を学ぶ必要があります:)私は質問がある、私はマンダリンにある別のjsonファイルがあり、エンコーディングは全く心配無用です!しかし、それが生のものを印刷するとき、イエスとノーのいくつかは正面に2つのタブを持っています。フォーマットはほぼ同じですが、行の一部だけがもう1つタブを見つけられるかもしれません。それとも私のjsonファイルの問題ですか?ありがとうございました! :) – Makiyo

+0

私は別のエンコーディングでは何もしていないので、あまり助けになることはできません。 –

0

pythonの二重引用符は、追加された項目の順序を保持できません。 json.dumps()は、指定されたjsonからdictを作成します。

OrderedDictを使用すると、順序を保持できます。

from collections import OrderedDict 
s = json.loads(open(r'C:\Users\makiyo\fruit.json').read(), object_pairs_hook=OrderedDict) 

# recursively print in desired format. 
def print_json(json): 
    for k, v in json.iteritems(): 
     print k, v 
     if type(v) is OrderedDict: 
      print_json(v) 
print_json(s) 

それとも、Pythonの3.6を使用することができます - あなたのコードがきちんとあるDictionaries are ordered in Python 3.6+

関連する問題