Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于php解码JSON的问题_Php_Json - Fatal编程技术网

关于php解码JSON的问题

关于php解码JSON的问题,php,json,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解码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 />';
    }
}
foreach($data->Documents as$result){
回显htmlspecialchars($result->DocTitle)。“
”; 如果(!empty($result->Docmultimedia)){ 回显htmlspecialchars($result->Docmultimedia->DocExpire)。“
”; } }
它返回
警告:为foreach()提供的参数无效
。
和echo htmlspecialchars($result->Docmultimedia->DocExpire)
,它写对了吗?谢谢大家。

前提条件: 该问题基于MSNBC api()

回答:
API调用
您应该在调用API时不使用尾随的
&jsonp=all
,这将使json可计算

API结果 MSN返回一些带有
NaN
的值,经证明,NaN不是有效的JSON

结果消化
我提供了一个关于消化要点的

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

我注意到,在API结果中,从未出现过
Docmultimedia
,而
DocExpire
是文档的属性。通过
$result->DocExpire
先决条件检索它: 该问题基于MSNBC api()

回答:
API调用
您应该在调用API时不使用尾随的
&jsonp=all
,这将使json可计算

API结果 MSN返回一些带有
NaN
的值,经证明,NaN不是有效的JSON

结果消化
我提供了一个关于消化要点的

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


我注意到,在API结果中,从未出现过
Docmultimedia
,而
DocExpire
是文档的属性。首先,您收到的是JSONP,而不是纯JSON。为了解码JSON,您必须删除,
all(…)第一个:

$data = trim($json, 'all();');
其次,您需要解码JSON。PHP不会自动执行此操作:

$data = json_decode($data);
现在,您应该可以执行以下操作:

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

首先,您收到的是JSONP,而不是纯JSON。为了解码JSON,您必须删除,
all(…)第一个:

$data = trim($json, 'all();');
其次,您需要解码JSON。PHP不会自动执行此操作:

$data = json_decode($data);
现在,您应该可以执行以下操作:

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


您似乎没有正确处理字符串。否则,
$data->Documents
将返回一个数组。在我看来很像。您是否检查了
$data
是否为
false
$data->Documents
是否不为空?因为JSON数据的开头有
all(…)
?对不起,我是个新手。那是什么东西?invlid json?您似乎没有正确处理字符串。否则,
$data->Documents
将返回一个数组。在我看来很像。您是否检查了
$data
是否为
false
$data->Documents
是否不为空?因为JSON数据的开头有
all(…)
?对不起,我是个新手。那是什么东西?invlid json?@Felix Kling如果他没有解析$data,他会在第一个foreach中收到一条错误消息,而不是在htmlspecials中fnc@SamuelHerzog:但他收到错误消息:警告:为foreach()提供的参数无效。不过你是对的,他在循环中错误地访问了其他值。@Felix Kling因为Docmultimedia属性是一个数组,与解码无关,而且他已经循环$data->Documents,我不知道你的答案会是什么help@cj333:您可能希望传递JSON(不带
all(..);
)看看它是否有效。@cj333:不知道你的意思。JSONP只是JSON包装在函数调用中。函数调用是
all(…)。为了获得JSON字符串,您必须删除它。请查看Wikipedia for JSONP。@Felix Kling如果没有解析$数据,他会在第一个foreach中收到一条错误消息,而不是在htmlspecials中fnc@SamuelHerzog:但他收到错误消息:警告:为foreach()提供的参数无效。不过你是对的,他在循环中错误地访问了其他值。@Felix Kling因为Docmultimedia属性是一个数组,与解码无关,而且他已经循环$data->Documents,我不知道你的答案会是什么help@cj333:您可能希望传递JSON(不带
all(..);
)看看它是否有效。@cj333:不知道你的意思。JSONP只是JSON包装在函数调用中。函数调用是
all(…)。为了获得JSON字符串,您必须删除它。请查看Wikipedia for JSONP。@cj333能否在gist或codepad(felix和我的示例所在的地方)上发布一个(简化的)代码示例。然后我就可以查看代码了。@cj333:我得到了这个错误:
“纬度”:NaN
NaN
在JSON中无效。也许你应该写一份bug报告。@cj333 Gist现在是最新的,提供了所有需要的信息。我用“”包装了所有NaN事件,因此在您的工作应用程序中添加一个实际信息检查,而不是NaN。希望对您有所帮助:)@cj333很高兴帮助您:),我认为用
null
替换它是最明智的选择。如果您使用的是我的示例,您只需为此更改
$NaNReplacement
。另外,请寻找一种向MSNBC填写错误报告的方法,以便他们能够修复该错误。@cj333:您可以执行
str_replace(':NaN',':null',$json)