传入的数据类似于以下内容:
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"
}]
当它击中后续数组时。我该如何解决这个问题?
答案 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,它使解析更加容易。