当键更改且值是更多键值对时,是否可以订购键值对的JSON对象。

时间:2018-04-26 02:23:33

标签: python json string sorting

在python中,我无法弄清楚如何将JSON对象(如下所示)输出为字符串,其中Baseball的内容基于“key1”(降序)进行排序。当我收到JSON(来自数据源)时,它会让玩家失灵。最终,我的代码需要订购玩家,然后将其传递给下一个订购的功能。请假设我不能将JSON的格式修改为/具有数组,因为消费函数无法处理(就像当前编写的那样)。

示例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 个答案:

答案 0 :(得分:1)

使用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)