【问题标题】:What is best way to parse not separated (invalid) json string?解析未分隔(无效)json字符串的最佳方法是什么?
【发布时间】:2017-02-03 18:21:06
【问题描述】:

我想将一些 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 模块在流中发送存档,所以这就是为什么我的 sn-p 中的 json 数据之间没有分隔符。

【问题讨论】:

  • json_decode ?
  • json_decode 返回 null
  • 您提供的字符串是无效的 json,所以 .... 是的,json_decode 不太可能返回任何内容。
  • 是的,正如我所说,正在寻找解决方案。
  • $json = '[' . str_replace('}{', '},{', $json) . ']'; 如果您想要一个非常快速和肮脏的解决方案,请注意,如果有任何包含文本 }{ 的字符串,它不能保证工作。并且停止使用任何返回此类数据的东西,这是一个非常糟糕的信号。

标签: php json parsing


【解决方案1】:

如果不更改输出或使用 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 与 explode 一起使用:

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

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

【讨论】:

  • OP在cmets中提到他不能改变数据的来源。
【解决方案2】:
$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

【讨论】:

    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2019-09-16
    • 2017-04-04
    • 2011-09-05
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多