【问题标题】:Json output sorting/order issueJson 输出排序/顺序问题
【发布时间】:2019-12-04 22:16:11
【问题描述】:

我有一个从 SQL 查询排序结果构建的字典,就在我 jsonify() 输出这个结果之前,当我打印到控制台时它显示以下内容(按照我想要的正确顺序,按 num 键排序):

{'tradelist': [{'num': 0, 'trade': 1, 'type': 'entry long', 'signal': 'Long', 'date': '2017-01-31', 'price': 928.5, 'contracts': 109.1395}, {'num': 1, 'trade': 1, 'type': 'exit long', 'signal': 'Short', 'date': '2017-03-10', '价格': 1005.0, '合约': 109.1395}, {'num': 2, 'trade': 2, 'type': '入场空头', 'signal': '空头', 'date': '2017-03-10', 'price': 1005.0, 'contracts': 84.0427}, {'num': 3, 'trade': 2, 'type': 'exit short', 'signal': '关闭挂单 短','日期':'2017-03-19','价格':970.0,'合同':84.0427}]}

之后我除了返回 jsonify(result) 之外什么都不做,但是当我通过 REST API 运行查询时,输出显示如下:

{"tradelist":[{"contracts":109.1395,"date":"2017-01-31","num":0,"price":928.5,"signal":"Long","trade ":1,"类型":"条目 long"},{"contracts":109.1395,"date":"2017-03-10","num":1,"price":1005.0,"signal":"Short","trade":1," type":"exit long"},{"contracts":84.0427,"date":"2017-03-10","num":2,"price":1005.0,"signal":"Short","trade ":2,"type":"条目 short"},{"contracts":84.0427,"date":"2017-03-19","num":3,"price":970.0,"signal":"收盘 entry(s) order Short","trade":2,"type":"exit short"}]}

所以似乎 Jsonify 出于某种原因弄乱了顺序并对键进行了字母排序,任何关于如何防止这种情况发生的建议


sql = "SELECT num, trade, type, signal, date, price, contracts from tradelist ORDER BY num"
query = conn.execute(sql)
result = {'tradelist': [dict(zip(tuple (query.keys()), row)) for row in query.cursor]}
print(result)
return jsonify(result)

【问题讨论】:

  • 我仍然按顺序看到 num-0>num-1>num-2>num-3 条记录。你说的是json列表里面的键吗?
  • jsonify 来自哪里?
  • 这真的会导致问题吗?没有什么应该关心 JSON 对象的项目的顺序。
  • @mad_ 确实,在谈论密钥顺序
  • @glibdud jsonify 随 Flask 一起提供,同意如果输出被解析它不会发挥太大作用,一切都在那里,但它是客户要求准确地显示输出,因为它在 sql 表中

标签: python json sqlite dictionary


【解决方案1】:

如果您会注意到,在您的输出中,键是按字母递增的方式排列的。可能有两个原因。 (1) python 中的字典,不保证具有相同的顺序(按它们添加的顺序)。如果您想保留订单,您可能需要使用 OrderedDict。 (2) query.keys() 的元组已经以自己的内部有序方式进入python,这就是输出存在的原因。

假设这里条件 1 为真,我对您的代码进行了如下轻微更改。

from collections import OrderedDict
sql = "SELECT num, trade, type, signal, date, price, contracts from tradelist ORDER BY num"
query = conn.execute(sql)
result = {'tradelist': [OrderedDict(zip(tuple (query.keys()), row)) for row in query.cursor]}
print(result)
return jsonify(result)

如果它对您有用,请告诉我。在这种情况下,我很好奇条件 1 是正确的还是 2。谢谢。

【讨论】:

  • 感谢您的建议,但使用 OrderedDict 不会更改顺序
  • 在这种情况下,我将尝试通过以下引号更改第四行(在上面的帖子中)。最后尝试看看它是否有效。 "result = {'tradelist': [OrderedDict(zip(tuple ('num', 'trade', 'type', 'signal', 'date', 'price', 'contracts'), tuple(row['num '], row['trade'], row['type'], row['signal'], row['date'], row['price'], row['contracts']))) for row in query.cursor]}"。
  • 感谢您的努力!但这会引发 TypeError: tuple expected at most 1 arguments, got 7. 不管怎样,这是 jsonify 造成的,我正在考虑用具有 sort_keys=False 参数的 json.dumps 替换它,然后它就可以了,但是我现在似乎有双 json 正在进行,并且 ' 变成 \" 在输出中
  • @GlennDeVos 是的,对此感到抱歉。 tuple 关键字是错误的原因。这应该有效。 "result = {'tradelist': [OrderedDict(zip(('num', 'trade', 'type', 'signal', 'date', 'price', 'contracts'), (row['num'] , row['trade'], row['type'], row['signal'], row['date'], row['price'], row['contracts']))) 查询中的行。光标]}"
猜你喜欢
  • 2020-08-27
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 2016-09-01
  • 2016-08-01
相关资源
最近更新 更多