关于php解码JSON的问题

时间:2011-01-08 22:11:53

标签: php json

我还有一些关于php解码JSON的问题。 JSON像这样返回。

all({"Total":30,"Debug":null,"Documents":[
{
  "DocTitle":"Image: A municipal police officer takes positio",
  "Docmultimedia":[
        {
          "DocExpire":"2/7/2011 1:39:02 PM"
        }
      ]
    }
 ...]
});

这是我的PHP代码:

foreach ($data->Documents as $result) { 
    echo htmlspecialchars($result->DocTitle).'<br />';
    if(!empty($result->Docmultimedia)){
        echo htmlspecialchars($result->Docmultimedia->DocExpire).'<br />';
    }
}

返回Warning: Invalid argument supplied for foreach()。 和echo htmlspecialchars($result->Docmultimedia->DocExpire),它写得对吗?谢谢大家。

2 个答案:

答案 0 :(得分:2)

前提条件: 问题基于MSNBC api(http://api.msnbc.msn.com/documents/GetDocuments?keyword=usa&jsonp=all

答案
API致电
您应该在没有尾随&jsonp=all的情况下调用API,这将使json可评估

API结果 MSN使用NaN返回一些值,NaN不是JSONLint证明的有效JSON。

结果摘要
我在GIST上提供 working example 进行消化。

Docmultimedia是一个数组,如“Docmultimedia”所示: [ {...} ] 你必须致电$result->Docmultimedia[0]->DocExpire来检索它。或者迭代它。

我注意到在API结果中始终没有Docmultimedia,而DocExpire是文档的属性。通过$result->DocExpire检索它。

答案 1 :(得分:2)

首先,您收到的是JSONP,而不是纯JSON。要解码 JSON,您必须首先删除all(...);

$data = trim($json, 'all();');

其次,您需要解码JSON。 PHP不会自动执行此操作:

$data = json_decode($data);

现在你应该做的事情:

foreach($data->Documents as $result) {
    // something
}

DEMO