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

在Python中编写JSON对象时的键顺序[duplicate]

  •  -1
  • nad  · 技术社区  · 6 年前

    作为webservice调用的结果,我需要显示如下输出

    {
      "predictions": [
        {
          "id": 18009,
          "cuisine": "italian",
          "probability": 0.17846838753494407
        },
        {
          "id": 28583,
          "cuisine": "italian",
          "probability": 0.1918703125538735
        }
      ]
    }
    

    我有以下代码来创建对象:

        json_data = []
        for i in range (0, len(predicted_labels)):
            data = {}
            data['id'] = int(test['id'][i])
            data['cuisine'] = categoricalTransformer[predicted_labels[i]]
            item = predicted_probability[i]
            data['probability'] = item[predicted_labels[i]]
            json_data.append(data)
        json_return = {"predictions":json_data}
        return jsonify(json_return)
    

    {
      "predictions": [
        {
          "cuisine": "italian",
          "id": 18009,
          "probability": 0.17846838753494407
        },
        {
          "cuisine": "italian",
          "id": 28583,
          "probability": 0.1918703125538735
        }
      ]
    }
    

    我该怎么办?

    2 回复  |  直到 6 年前
        1
  •  2
  •   RoadRunner    6 年前

    用一个新的字典重建你的新字典 collections.defaultdict() collections.OrderedDict()

    from collections import OrderedDict
    from collections import defaultdict
    from json import dumps
    
    data = {
        "predictions": [
            {"id": 18009, "cuisine": "italian", "probability": 0.17846838753494407},
            {"id": 28583, "cuisine": "italian", "probability": 0.1918703125538735},
        ]
    }
    
    key_order = ["id", "cuisine", "probability"]
    
    result = defaultdict(list)
    for dic in data["predictions"]:
        ordered = OrderedDict((key, dic.get(key)) for key in key_order)
        result["predictions"].append(ordered)
    
    print(dumps(result))
    # {"predictions": [{"id": 18009, "cuisine": "italian", "probability": 0.17846838753494407}, {"id": 28583, "cuisine": "italian", "probability": 0.1918703125538735}]}
    

    json.dumps() 这里将字典序列化为JSON格式的字符串。

    注: 蟒蛇3.6+ ,您可以使用普通词典而不是 OrderedDict() Are dictionaries ordered in Python 3.6+?

    对于对Python3.6有最低要求的应用程序,您可能可以依赖此功能。此外,它可能对用户更安全 OrderedDict() 无论如何,您的代码可以向后兼容所有python版本。

        2
  •  0
  •   ycx    6 年前

    Ordered Dictionary . 它会记住插入顺序,您可以通过这种方式组织json集合。

    datadict = {'a':'a', 'c':'c', 'b':'b'}
    import collections
    
    print (collections.OrderedDict(datadict))
    #OrderedDict([('a':'a'), ('c':'c'), ('b':'b')])
    
    x = collections.OrderedDict(datadict)
    print (dict(x))
    #{'a':'a', 'c':'c', 'b':'b'}
    
    print (x == datadict)
    #True
    
    
    print (collections.OrderedDict(sorted(datadict.items(), key=lambda t:t[0])))
    #OrderedDict([('a':'a'), ('b':'b'), ('c':'c')])
    
    z = collections.OrderedDict(sorted(datadict.items(), key=lambda t:t[0]))
    print (dict(z))
    #{'a':'a', 'b':'b', 'c':'c'}
    
    print (z == datadict)
    #True
    

    使用此选项,您可以转换 json_return OrderedDict 使用所需的插入顺序,然后返回 有序的 对象或将其转换回 dict