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

时间:2019-01-07 02:19:22

标签: python json

由于网络服务调用,我需要显示以下输出

<button class="modal-button" href="#myModal1">Open Modal</button>

<!-- The Modal -->
<div id="myModal1" class="modal">

  <!-- Modal content -->
  <div class="modal-content">
      <span class="close">×</span>
<img src="https://cdn-images-1.medium.com/max/1000/1*6cpWeq1_VMYtd1LgHwxKug.jpeg">
  </div>

</div>

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

{
  "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)

我该怎么办?

2 个答案:

答案 0 :(得分:2)

使用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格式的字符串。

注意::如果您使用的是 Python3.6 + ,则可以记住普通的字典,而不是OrderedDict(),因为会记住键的插入顺序。但是,在3.6中它是一种实现功能,而在3.7中它是一种语言功能。您可以在Are dictionaries ordered in Python 3.6+?上了解有关此内容的更多信息。

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

答案 1 :(得分:0)

您可以查看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,然后返回该OrderedDict对象或将其转换回dict并返回该字典