php中的增量JSON解析

php中的增量JSON解析,php,json,streaming,Php,Json,Streaming,在php程序中,我想增量解析JSON。例如,给定部分JSON [1, 2, {"id": 3}, 我想在JSON输入的其余部分流式传输之前就获得1、2和字典。php只返回NULL,并且似乎没有办法获得错误的位置。如果每个元素都保证完整接收,那么有一个简单的解决方法,或者换句话说,您无法获得,例如,像这样的对象的一半: {"a": 1, json\u decode()将返回NULL,因为传递给它的字符串不是有效的json字符串。将尾随逗号替换为结束括号,然后执行以下操作: [1, 2, {"i

在php程序中,我想增量解析JSON。例如,给定部分JSON

[1, 2, {"id": 3},

我想在JSON输入的其余部分流式传输之前就获得1、2和字典。php只返回
NULL
,并且似乎没有办法获得错误的位置。

如果每个元素都保证完整接收,那么有一个简单的解决方法,或者换句话说,您无法获得,例如,像这样的对象的一半:

{"a": 1,
json\u decode()
将返回NULL,因为传递给它的字符串不是有效的json字符串。将尾随逗号替换为结束括号,然后执行以下操作:

[1, 2, {"id": 3}]

现在解码它并等待稍后接收到流的其他部分是没有问题的。

更新

我已经编写了一个小类,可以逐个char进行JSON输入解析。。

刚从印刷机上取下来,所以可能有一些虫子。。如果你决定试试,请告诉我

--

您能否(在跟踪'{'、'['、']'、'}'范围的同时)在每个不属于字符串值的逗号上分解流? 然后使用json_decode()处理每个令牌

如果json流没有太多大型对象(因为它们只有在完全到达后才会被解析),那么这个解决方案将最有效


编辑:如果它确实有大型对象,则可以修改此策略,使其看起来更“深入”。。但是这里的复杂性会急剧上升。

我已经写了一篇文章,应该可以做到这一点。让我知道它是否有效

这是一个类似的问题,但它的内容与标题所期望的大不相同,而且它与语言无关,因此大多数答案都与Java有关。+1。哇,好问题,难道不可能等到json的其余部分流出来吗?@Rikudo Sennin如果流非常慢(因为它是由一个缓慢的过程生成的),甚至是无限的,就不可能了。这有限制吗?例如,它能返回一个在数字<代码>中的片段[1, 2,{“ID”:3 }吗?,…,4和
5,46,47,…
其中
45
应该是一个数字?这里有一个想法:为什么不使用像zeromq这样的东西,让服务器在处理完一些数据包后将数据包推送到队列中。然后,您侦听队列的代码可以很容易地在它们一进来就显示它们。不幸的是,我可以得到半个obj但即使这不是一个问题,这个解决方案也是Θ(n²),尽管非常简单。当然,这正是我希望我正在搜索的库能够实现的解决方案。@jlb这确实很容易。JSON设计得很容易解析。就我所知,您需要跟踪作用域和未设置作用域的双引号。@philhag您能将我链接到从流读取的代码吗?(不是流本身——我会尝试复制它)@philhag看看我上面添加的github repo我尝试使用下面的@Rob parser来流式传输远程API,但是如果原始JSON对象很复杂,它就不能很好地工作。这更容易使用。