代码之家  ›  专栏  ›  技术社区  ›  Xandrix

当键发生变化并且值是更多的键值对时,是否可以对键值对的JSON对象进行排序。

  •  2
  • Xandrix  · 技术社区  · 8 年前

    在python中,我很难理解如何将JSON对象(如下所示)输出为字符串,其中棒球的内容是基于“key1”(降序)排序的。当我收到JSON(来自数据源)时,它会让玩家们混乱不堪。最终,我的代码需要对播放器进行排序,然后将其传递给下一个已排序的函数。请假设我无法将JSON的格式修改为be/have数组,因为消费函数无法处理这一点(正如当前编写的那样)。

    JSON示例:

     {
        "DataSource1":{
            "Baseball":{
                "Sean":{
                    "key1":"10",
                },
                "Gene":{
                   "key1":"100",
                },
                "Alan":{
                    "key1":"1",
                }
            }
        },
        "DataSource2":{
            "Baseball":{
                "Bob_Smith":{
                    "key1":"1"
                },
                "Adam_Filmore":{
                   "key1":"100"
                },
                "Joe_Allen":{
                    "key1":"10"
                }
            }
        }
        "DataSource3":{
            "Baseball":{
                "Jake":{
                    "key1":"10"
                },
                "Huck":{
                    "key1":"1"
                },
                "Eric":{
                   "key1":"100"
               }
            }
        }
    }
    

    我希望JSON如何输出的示例:

     {
        "DataSource1":{
            "Baseball":{
                "Alan":{
                    "key1":"1",
                },
                "Sean":{
                    "key1":"10",
                },
                "Gene":{
                   "key1":"100",
               }
            }
        },
        "DataSource2":{
            "Baseball":{
                "Bob_Smith":{
                    "key1":"1"
                },
                "Joe_Allen":{
                    "key1":"10"
                },
                "Adam_Filmore":{
                   "key1":"100"
                }
            }
        }
        "DataSource3":{
            "Baseball":{
                "Huck":{
                    "key1":"1"
                },
                "Jake":{
                    "key1":"10"
                },
                "Eric":{
                   "key1":"100"
               }
            }
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Robᵩ    8 年前

    使用 sorted() 要建立所需的排序顺序,请将结果存储在 collections.OrderedDict 。

    尝试以下操作:

    import json
    from collections import OrderedDict
    
    with open('data.json') as f:
        data = json.load(f)
    
    for data_source in data:
        data[data_source]["Baseball"] = OrderedDict(
            sorted(data[data_source]["Baseball"].items(),
                   key=lambda x: x[1]["key1"]))
    
    with open('new_data.json', 'w') as f:
        json.dump(data, f, indent=4)