是否可以使用ijson在内存中创建和加载JSON对象(而不是从/到文件)?

时间:2017-07-05 06:57:10

标签: python ijson

我正在尝试使用ijson代替json,以便能够有效地将字典转储/加载到字符串(内存中,而不是文件中)[1]。

ijson是否有类似标准转储/加载json的示例?我见过的所有使用ijson的资源都只包含文件示例。

[1] - 字典正在转换为字符串,以便将它们存储在集合

2 个答案:

答案 0 :(得分:1)

你可以达到这两个目标(dict to string和string to dict而不使用json lib)。

让我们看一下上面的例子:

import ast
di = {"a":2, "b": 3}

print (str(di))
>>> "{'a': 2, 'b': 3}"

print (type(str(di)))
>>> <class 'str'>

print (ast.literal_eval(str(di)))
>>> {'a': 2, 'b': 3}

print (type(ast.literal_eval(str(di))))
>>> <class 'dict'>

你有一本字典,为了把它变成字符串,你只需要将它转换为str

如果要将str返回到dict,可以使用ast lib。

您可以阅读有关ast.literal_eval

的更多信息
  

ast.literal_eval(node_or_string)

     

安全地评估表达式节点或包含Python文字或容器显示的Unicode或Latin-1编码字符串。

修改

经过进一步调查并跟随this SO question似乎使用json可以让你获得更快的结果(性能)。

在所附链接上查看abarnert答案,特别是:

  

为什么json.loads这么快?

     

因为Python文字语法是一个   比JSON更复杂,更强大的语言,它可能会更慢   要解析。并且,可能更重要的是,因为Python文字   语法不能用作数据交换格式(in   事实上,它不应该被用于那个),没有人   可能会花费很多精力来快速进行数据交换。

import json
di = {"a":2, "b": 3}

print (json.dumps(di))
>>> '{"a": 2, "b": 3}'

print (type(json.dumps(di)))
>>> <class 'str'>

print (json.loads(json.dumps(di)))
>>> {'a': 2, 'b': 3}

print (type(json.loads(json.dumps(di))))
>>> <class 'dict'>

答案 1 :(得分:1)

以表现的方式补充omri_saadon的答案,

这是一个链接(serializer speed comparisons),用于衡量一些鲜为人知的JSON模块,其中一个被发现有效地胜过其他模块(msgpack),可以与json互换使用

因此,ijson代替json或标准msgpack,目前正用于dict / str转换。

安装:     pip install msgpack

使用:     import msgpack as json # can use dumps/loads functions