首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python:如何使用ijson库解析json数组流

python:如何使用ijson库解析json数组流
EN

Stack Overflow用户
提问于 2015-12-11 05:59:36
回答 2查看 2.6K关注 0票数 2

传入的数据类似于以下内容:

代码语言:javascript
复制
[{
    "foo": "bar"
}]
[{
    "bar": "baz"
}]
[{
    "baz": "foo"
}]

正如您所看到的,对象数组串在一起。吉森什

ijson能够处理第一个数组,然后我得到:

代码语言:javascript
复制
ijson.common.JSONError: Additional data

当它击中后续数组时。我怎么才能避开这一切?

EN

回答 2

Stack Overflow用户

发布于 2015-12-11 06:23:00

下面是一个问题的第一个切分:至少有一个有效的regex替换来将一个完整的字符串转换为有效的json。只有当您在作为json解析之前读取完整的输入流时,它才能工作。

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2018-10-27 10:52:29

您可以使用解码遍历字符串。它的文件确实说:

这可以用于从可能在末尾具有无关数据的字符串中解码JSON文档。

下面的代码示例假设所有JSON值都在一个大字符串中:

代码语言:javascript
复制
def json_elements(string):
    while True:
        try:
            (element, position) = json.JSONDecoder.raw_decode(string)
            yield element
            string = string[position:]
        except ValueError:
            break

为了避免自己处理raw_decode,并能够逐块解析流,我推荐我为此目的创建的一个库:流星猫

代码语言:javascript
复制
def json_elements(stream)
    decoder = json.JSONDecoder()
    yield from streamcat.stream_to_iterator(stream, decoder)

这适用于JSON值的任何连接,无论它们中或它们之间使用了多少空格字符。

如果您能够控制输入流的编码方式,您可能需要考虑使用行分隔的JSON,这使得解析变得更容易。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34217042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档