迭代JSON对象列表

时间:2017-11-24 11:21:17

标签: python json sorting iterator

我有一个JSON文件包含一个像这样的列表:

"locales": {
    "de": {
        "default": {
            "vegetables": [
                "apple", 
                "melon", 
                "grape", 
                "pear"
            ]
        }
    }, 
    "fr": {
        "default": {
            "vegetables": [
                "apple", 
                "melon", 
                "grape", 
                "pear"
            ]
        }
    }, 
    "nl": {
        "default": {
            "vegetables": [
                "apple", 
                "melon", 
                "grape", 
                "pear"
            ]
        }
    },
(...)
}

我想根据区域设置(de,fr,nl等)迭代locales广告操作vegetables。我怎么能用python实现呢?

我试过像

这样的东西
import json 

_MY_CUSTOM_ORDER_DE = [
    "pear",
    "grape",
    "apple",
    "melon"]

_MY_CUSTOM_ORDER_NL = [
    "melon",
    "pear",
    "apple",
    "grape"]

def updateJsonFile():
    jsonFile = open('vegetables.json', 'r') 
    data = json.load(jsonFile) 
    jsonFile.close() 

    for item in data["locales"]:
        if item == "de":
            item["default"]["vegetables"] = _MY_CUSTOM_ORDER_DE
        elif item == "nl":
            item["default"]["vegetables"] = _MY_CUSTOM_ORDER_NL
        else:
            ## do nothing ##

        with open('sortedvegetables.json', 'w') as outfile:
        json.dump(data, outfile, indent=4, sort_keys=True)

def main():
    updateJsonFile()

if __name__ == '__main__':
    main()

不幸的是,这不起作用,但是在执行脚本后终端中出现了错误。 sortedvegetables.json看起来与vegetables.json

完全相同

2 个答案:

答案 0 :(得分:1)

在这里你的回答:

你在代码中遇到了一些逻辑错误。

1)你试图比较列表。

if item == ["de"]:

应该是:if item == "de":

2)您尝试更新为item["default"]["vegetables"],这不是正确的方式,应该恰当地写为data["locales"]["de"]["default"]["vegetables"]data["locales"]["nl"]["default"]["vegetables"]

import json

_MY_CUSTOM_ORDER_DE = [
    "pear",
    "grape",
    "apple",
    "melon"]

_MY_CUSTOM_ORDER_NL = [
    "melon",
    "pear",
    "apple",
    "grape"]

def updateJsonFile():
    jsonFile = open('vegetables.json', 'r')
    data = json.load(jsonFile)
    jsonFile.close()

    for item in data["locales"]:
        print(item)
        if item == "de":
            print(item)
            data["locales"]["de"]["default"]["vegetables"] = _MY_CUSTOM_ORDER_DE
        elif item == "nl":
            print(item)
            data["locales"]["nl"]["default"]["vegetables"] = _MY_CUSTOM_ORDER_NL
        else:
            print("test")
            pass

        with open('sortedvegetables.json', 'w') as outfile:
            json.dump(data, outfile, indent=4, sort_keys=True)

def main():
    updateJsonFile()

if __name__ == '__main__':
    main()

答案 1 :(得分:0)

您对JSON的含义存在根本性的误解。字典中没有固有的顺序;尝试对条目进行排序毫无意义。

早期版本中的Python会将解释器发生在内部的任何顺序转储出内部dict,无论您对它进行了多少排序。使用最新的Python版本,您可以期望dict按照您创建它的顺序返回...但是JSON语义最终仍然是一个没有任何字典顺序的表示。