【问题标题】:python3: can json be decoded as tuple? [duplicate]python3:json可以解码为元组吗? [复制]
【发布时间】:2018-12-16 16:22:58
【问题描述】:
import json
t = (((9, 1, 4),), (), ((14, 5, 10),), ((0, 4, 5),))
j = json.dumps(t)
x = json.loads(j)
print(t) # (((9, 1, 4),), (), ((14, 5, 10),), ((0, 4, 5),))
print(x) # [[[9, 1, 4]], [], [[14, 5, 10]], [[0, 4, 5]]]

如何直接从 json.loads() 将 json 字符串解码为(层次结构深的)元组?

我知道 json 编码将元组和列表都保存为“数组”,但实际上,我的不可变“t”变量非常大并且是只读的,因此元组样式(据我所知)更快更紧凑在内存中比在列表样式中。

想法?谢谢!

【问题讨论】:

  • 你控制 json 的创建,还是只控制加载部分?
  • 是的,我可以控制编码和解码
  • 你确定你需要json吗?你不能用pickle来保留python变量类型吗?
  • 不幸的是,json 是一个约束,因为其他人应该可以读取数据。

标签: python json


【解决方案1】:

JSONJavaScript Object Notation 的缩写形式,在 JavaScript 中有称为 array 的数据结构,我们使用方括号 @ 来定义数组987654323@ ] 不是括号 ( ) 就像 Python 中的元组一样。

因此,每当您尝试将元组转换为字符串json.dumps() 时,它都会在内部更改为像 JavaScript 中的数组形式,并在 Python 中用括号列出[ ] 在它周围。

import json
t = (((9, 1, 4),), (), ((14, 5, 10),), ((0, 4, 5),))

j = json.dumps(t)
x = json.loads(j)
print(t) # (((9, 1, 4),), (), ((14, 5, 10),), ((0, 4, 5),))
print(x) # [[[9, 1, 4]], [], [[14, 5, 10]], [[0, 4, 5]]]

如果您的意图是将 tuples 转换为 strings 并再次从该字符串表示形式转换为真正的 Python 对象(这里是 tuple ) 那么这就是解决方案。

j2 = str(t) 
x2 = eval(j2) 
print(j2) # (((9, 1, 4),), (), ((14, 5, 10),), ((0, 4, 5),))
print(x2) # (((9, 1, 4),), (), ((14, 5, 10),), ((0, 4, 5),))

【讨论】:

  • 哇!我希望 eval() 足够高效,无论如何这是一个很好的解决方案! :-)
  • 确保您了解 eval() 的风险 - 阅读文档
  • 是的,没错,它也计算字符串表达式。除此之外其他也。最后通过评估字符串来提供 Python 对象。谢谢。
  • 更好的选择是使用repr()ast.literal_eval()。这是因为repr() 在没有文字str 表示且literal_eval() 执行安全的eval 操作时提供对象的详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
相关资源
最近更新 更多