传入的数据类似于以下内容:
[{
"foo": "bar"
}]
[{
"bar": "baz"
}]
[{
"baz": "foo"
}]正如您所看到的,对象数组串在一起。吉森什
ijson能够处理第一个数组,然后我得到:
ijson.common.JSONError: Additional data当它击中后续数组时。我怎么才能避开这一切?
发布于 2015-12-11 06:23:00
下面是一个问题的第一个切分:至少有一个有效的regex替换来将一个完整的字符串转换为有效的json。只有当您在作为json解析之前读取完整的输入流时,它才能工作。
import re
input = ''
for line in inputStream:
input = input + line
# input == '[{"foo": "bar"}][{"bar": "baz"}][{"baz": "foo"}]'
# wrap in [] and put commas between each ][
sanitizedInput = re.sub(r"\]\[", "],[", "[%s]" % input)
# sanitizedInput == '[[{"foo": "bar"}],[{"bar": "baz"}],[{"baz": "foo"}]]'
# then parse sanitizedInput
parsed = json.loads(sanitizedInput)
print parsed #=> [[{u'foo': u'bar'}], [{u'bar': u'baz'}], [{u'baz': u'foo'}]]备注:,因为您将整件事情作为字符串阅读,所以可以使用json而不是ijson
发布于 2018-10-27 10:52:29
您可以使用解码遍历字符串。它的文件确实说:
这可以用于从可能在末尾具有无关数据的字符串中解码JSON文档。
下面的代码示例假设所有JSON值都在一个大字符串中:
def json_elements(string):
while True:
try:
(element, position) = json.JSONDecoder.raw_decode(string)
yield element
string = string[position:]
except ValueError:
break为了避免自己处理raw_decode,并能够逐块解析流,我推荐我为此目的创建的一个库:流星猫。
def json_elements(stream)
decoder = json.JSONDecoder()
yield from streamcat.stream_to_iterator(stream, decoder)这适用于JSON值的任何连接,无论它们中或它们之间使用了多少空格字符。
如果您能够控制输入流的编码方式,您可能需要考虑使用行分隔的JSON,这使得解析变得更容易。
https://stackoverflow.com/questions/34217042
复制相似问题