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

时间:2015-12-11 05:59:37

标签: python arrays json

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

var x = '"Hello" & good morning';
var decodeHtmlEntity = function(x) {
  return x.replace(/&#(\d+);/g, function(match, dec) {
    return String.fromCharCode(dec);
  });
};
alert(decodeHtmlEntity(x));

如你所见,对象阵列串在一起。 JSON肥胖型

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

[{
    "foo": "bar"
}]
[{
    "bar": "baz"
}]
[{
    "baz": "foo"
}]

当它击中后续数组时。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

这是问题的第一次切入,至少有一个正则表达式替换将完整字符串转换为有效的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

答案 1 :(得分:0)

您可以使用json.JSONDecoder.raw_decode浏览字符串。它的文档确实说:

  

这可用于从结尾可能有无关数据的字符串中解码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并能够逐块解析流,我建议为这个确切目的而创建的库:streamcat

def json_elements(stream)
    decoder = json.JSONDecoder()
    yield from streamcat.stream_to_iterator(stream, decoder)

这适用于JSON值的任何串联,无论在其内部或之间使用多少个空白字符。

如果您可以控制输入流的编码方式,则可以考虑使用line-delimited JSON,它使解析更加容易。