【问题标题】:Iterate over list of JSON objects遍历 JSON 对象列表
【发布时间】:2018-05-08 09:47:37
【问题描述】:

我有一个包含如下列表的 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 完全一样

【问题讨论】:

  • 你能说得清楚点吗?无法理解您真正在看什么?举几个明确的例子!
  • 同时显示什么是 _MY_CUSTOM_ORDER_DE 和 _MY_CUSTOM_ORDER_NL
  • 你在哪里打电话updateJsonFile
  • 我编辑并粘贴了我的完整 python 脚本

标签: python json sorting iterator


【解决方案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()

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-29
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      相关资源
      最近更新 更多