python:以错误的格式读取json字典

时间:2017-10-25 02:42:32

标签: python json tree

我的json文件是字典格式,我想把它读入我的Python。这是我的原始文件。

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)

s的类型是dict:

{'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的格式,我不知道为什么他们会改变这样的'yes'/'no'位置。

2 个答案:

答案 0 :(得分: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

如果您不想保留引用,或者想要编辑dict,可以使用json.dumps

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

答案 1 :(得分:0)

python中的dictonary无法保留添加它们的项目的顺序。 json.dumps()从提供的json中创建一个字典。

您可以使用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+