在php程序中,我想逐步解析JSON。例如,给定部分JSON
[1, 2, {"id": 3},
我希望在流式传输剩余的JSON输入之前获得1,2和字典。 php的json_decode
只返回NULL
,似乎无法找到错误的位置。
答案 0 :(得分:6)
<强>更新强>
我写了一个小类,它通过char-by-char JSON输入解析.. https://github.com/janeklb/JSONCharInputReader
新鲜的印刷机,所以它可能有一些错误..如果你决定尝试一下,请告诉我!
-
你可以(在跟踪'{','[',']','}'范围的同时)在不是字符串值的每个逗号上打破流吗? 然后使用json_decode()处理每个令牌?
如果json流没有很多大对象(因为它们只有在完全到达时才会被解析),这个解决方案最有效。
编辑:如果它确实有大型对象,可以修改此策略以使其看起来更“深”......但这里的复杂性会上升。
答案 1 :(得分:3)
我写了SAX-like JSON streaming parser应该可以解决这个问题。让我知道它是否有效!
答案 2 :(得分:1)
有一个简单的解决方法,如果保证每个单独的元素都被完整地接收,或者换句话说 - 你不能得到例如只是这样一个对象的一半:
{"a": 1,
json_decode()
将返回NULL,因为您传递给它的字符串不是有效的JSON字符串。用尾部括号替换尾部逗号,然后你去:
[1, 2, {"id": 3}]
现在解码它没有问题,等待稍后接收流的其他部分。