【问题标题】:How can I preserve the order of an OrderedDict when converting it to JSON [duplicate]将 OrderedDict 转换为 JSON 时如何保留其顺序 [重复]
【发布时间】:2017-09-04 18:44:26
【问题描述】:

我正在使用烧瓶在 python3 中编写一个 REST API,我一直在努力寻找一种在保持键顺序的同时将 dict 返回为 json 的方法。我使用的是 OrderedDict,因为显然内置字典不会保留元素的顺序。

我有一个看起来像这样的方法:

@app.route('/foobar', methods=['GET'])
def foobar()
    data = [OrderedDict([("a",1),
        ("b",2),
        ("c",3)])]
    return jsonify(data),200

这是我可以获得的输出示例:

[{"b":2,"c":3,"a":1}]

这就是我想要的:

[{"a":1,"b":2,"c":3}]

如何按照在有序字典中定义的顺序返回 JSON?

编辑: 这不是重复的,因为链接的帖子仅适用于字典我需要它来处理字典列表

【问题讨论】:

    标签: python json python-3.x flask ordereddictionary


    【解决方案1】:

    根据RFC7159,JavaScript Object Notation (JSON) 是一种用于结构化数据序列化的文本格式。它源自 JavaScript 的对象文字,如 ECMAScript 编程语言标准第三版 [ECMA-262] 中所定义。

    对象是由零个或多个名称/值组成的 unordered 集合 对,其中名称是字符串,值是字符串、数字、 布尔值、空值、对象或数组。

    数组是由零个或多个值组成的ordered 序列。

    要为您的 json 制作订单,您可以使用以下命令:

    @app.route('/')
    def foobar():
        data = OrderedDict([("a",1), ("z",2), ("c",3)])
        return json.dumps([data])
    

    输出

    [{"a": 1, "z": 2, "c": 3}]

    如果 sort_keys 为 true(默认值:False),则字典的输出将按键排序。 对于排序,您可以将代码更改为:

    @app.route('/foobar', methods=['GET'])
    def foobar()
        data = [OrderedDict([("a",1),
            ("z",2),
            ("c",3)])]
        return json.dumps(data, sort_keys=True)
    

    输出

    [{"a": 1, "c": 3, "z": 2}]

    【讨论】:

      【解决方案2】:

      您的问题是 OrderedDict 保持新添加/修改的键/值对的插入顺序。

      这完全取决于您如何获取字典中的键/值。

      如果你通过了标准的 **kwargs,你就会失败。

      如果元素作为迭代传递(如您的示例中所示)或稍后插入,则顺序将保留。

      标准kwargs

      d = OrderedDict(a=1, b=2, c=3)
      data = [d]
      print(json.dumps(data))
      

      输出:

      [{"a": 1, "c": 3, "b": 2}]
      

      错误的顺序。

      但是有一个可迭代的

      d = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
      data = [d]
      print(json.dumps(data))
      

      输出:

      [{"a": 1, "b": 2, "c": 3}]
      

      订单已保留。

      手动插入

      d = OrderedDict()
      d['a'] = 1
      d['b'] = 2
      d['c'] = 3
      data = [d]
      print(json.dumps(data))
      

      输出:

      [{"a": 1, "b": 2, "c": 3}]
      

      订单又被保留了

      【讨论】:

        猜你喜欢
        • 2014-07-20
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-21
        • 2013-03-21
        • 1970-01-01
        相关资源
        最近更新 更多