解析未分隔(无效)json字符串的最佳方法是什么?


What is best way to parse not separated (invalid) json string?

我想解析一些json响应到php数组,问题是nginx推送流模块响应与不分离的json字符串,是否可以解析这个不使用正则表达式?

'{"id":1,"channel":"1","text":"Hello World!"}{"id":2,"channel":"1","text":"Hello World!"}{"id":2,"channel":"1","text":{"key_x": "value_x"}}'

编辑

真正的问题是nginx的push-stream模块在stream中发送存档,所以这就是为什么在我的代码片段中json数据之间没有分隔符。

$str = '{"id":1,"channel":"1","text":"Hello World!"}{"id":2,"channel":"1","text":"Hello World!"}{"id":2,"channel":"1","text":"Hello World!"}';
$str = str_replace('}{', '},{', $str);
$str = '[' . $str . ']';
print_r(json_decode($str));
https://3v4l.org/BNVTg

我认为如果不改变输出或使用regex/str_replace,这实际上是不可能的。

如果你可以控制输出,你应该将输出更改为有效的json:

{"data":[
    {"id":1,"channel":"1","text":"Hello World!"},
    {"id":2,"channel":"1","text":"Hello World!"},
    {"id":2,"channel":"1","text":"Hello World!"}
]}

如果你不能这样做,那么你可以尝试使用str_replace + explosion:

$data = str_replace('}{', '}<should_be_absolut_unique>{');
foreach( explode('<should_be_absolut_unique>', $data) as $json ){
    # json_decode($json)
}

这当然是非常不保存的,不能保证工作,因为如果你不知道发送的数据,你不知道字符串替换是否正确工作!