在PHP中解析非标准JSON

时间:2016-11-27 06:26:36

标签: php json

这是一种非标准的json格式api:

   WebInfo ({
    "name": "Google",
    "code": 1,
    "domain": "http://www.google.com/",
    })

由于数据不是标准JSON,json_decode()无法直接解析,我该怎么做才能使其成为有效的json格式?

2 个答案:

答案 0 :(得分:2)

您必须删除可以使用str_replace()

完成的WebInfo ()

试试这个:让我们假设你的WebInfo({...})字符串是$str然后执行此操作:

$str = str_replace('WebInfo(', '', $str); 
$str = str_replace(' )', '', $str);
print_r(json_decode($str, true));

警告: str_replace()将删除字符串中提到的每个字符。例如:如果我使用类似

的东西
str_replace('hello', 'hi', $str);

然后它会将hello中的每个hi替换为$str

答案 1 :(得分:1)

这看起来有点JSONP-ish,所以它实际上应该是有效的JSON,除了它包含在一个函数调用中。但是"domain": "http://www.google.com/",末尾的逗号肯定不属于那里。

你有几种方法可以解决这个问题:

  1. 剥离功能包装
  2. 仅当您知道函数名称时才有效。因此,如果您知道它将始终包含WebInfo(...),您可以只提取JSON部分子字符串:

    $jsonPart = substr($jsonpString, 8, -1); 
    

    其中8是“WebInfo(”和“-1”在最后处理“)”的长度。

    1. 解析JSON-part
    2. 只需解析第一个“{”和最后一个“}”之间的所有内容:

      preg_match("/\{(.*)\}/s", $jsonpString, $matches);
      

      由于只应该有一个匹配,所以你抓住第一个:

      $jsonPart = $matches[0];
      

      使用这种方法,您不需要知道包装函数名称的名称/长度。但是你仍然需要处理上面提到的那个尾随的逗号。是真的存在还是只是复制粘贴错误?