在PHP中,JSON在特殊字符上返回空?
我试图显示JSON中的一些值,但有两个显示失败,而其余的则工作正常。我怀疑这与里面的人物有关,但不知道如何继续 尝试过的技巧:在PHP中,JSON在特殊字符上返回空?,php,json,Php,Json,我试图显示JSON中的一些值,但有两个显示失败,而其余的则工作正常。我怀疑这与里面的人物有关,但不知道如何继续 尝试过的技巧: UTF-8-ing一切 直接正则化JSON 解码,用JSON_PRETTY_PRINT/JSON_UNESCAPED_UNICODE编码,然后再次解码 还有一些我再也记不起来了 任何关于如何解决这一问题的建议都将受到高度赞赏: var_转储$json { "products":{ "product":[{ "@id":"1
{
"products":{
"product":[{
"@id":"1",
"name":"First Name",
"fetchers":{
"fetcher":[{
"@fetcherId":"1",
"link1":"http:\/\/www.example.com\/pv\/?1&NAME=[[first-name\/1\/?refID=1\/first-name]]&denk5=[[1]]",
"link2":"http:\/\/www.example.com\/pc\/?1&NAME=[[first-name\/1\/?refID=1\/first-name]]&denk5=[[1]]"
}]
}
},{
"@id":"2",
"name":"Second Name",
"fetchers":{
"fetcher":[{
"@fetcherId":"2",
"link1":"http:\/\/www.example.com\/pv\/?1&NAME=[[second-name\/2\/?refID=2\/second-name]]&denk5=[[2]]",
"link2":"http:\/\/www.example.com\/pc\/?1&NAME=[[second-name\/2\/?refID=2\/second-name]]&denk5=[[2]]"
}]
}
}]
}
}
PHP代码
<?php
$json = json_decode($json,true);
foreach($json['products']['product'] as $data) {
echo $data['@id'].'<br/>';
echo $data['name'].'<br/>';
echo $data['fetchers']['fetcher']['@fetcherId'].'<br/>';
echo $data['fetchers']['fetcher']['link1'].'<br/>';
echo $data['fetchers']['fetcher']['link2'].'<br/>';
}
我得到的
1
First Name
1
http://www.example.com/pv/?1&NAME=[[first-name/1/?refID=1/first-name]]&denk5=[[1]]
http://www.example.com/pc/?1&NAME=[[first-name/1/?refID=1/first-name]]&denk5=[[1]]
2
Second Name
2
http://www.example.com/pv/?1&NAME=[[second-name/2/?refID=2/second-name]]&denk5=[[2]]
http://www.example.com/pc/?1&NAME=[[second-name/2/?refID=2/second-name]]&denk5=[[2]]
1
First Name
1
<- link1 empty
<- link2 empty
2
Second Name
2
<- link1 empty
<- link2 empty
1
名字
1.
您的问题与JSON无关,与字符编码无关。这是因为你没有选择正确的元素$data['fetchers']['fetcher']
是一个数组。如果需要第一个元素,请使用[0]
foreach($json['products']['product'] as $data) {
echo $data['@id'].'<br/>';
echo $data['name'].'<br/>';
echo $data['fetchers']['fetcher'][0]['@fetcherId'].'<br/>';
echo $data['fetchers']['fetcher'][0]['link1'].'<br/>';
echo $data['fetchers']['fetcher'][0]['link2'].'<br/>';
}
foreach($json['products']['product']作为$data){
echo$data['@id'].
;
echo$data['name'].
;
echo$data['fetchers']['fetcher'][0]['@fetcherId'].
;
echo$data['fetchers']['fetcher'][0]['link1'].
;
echo$data['fetchers']['fetcher'][0]['link2'].
;
}
另外,不要忘记对HTML上下文中使用的任意数据使用htmlspecialchars()
。您的问题与JSON无关,与字符编码无关。这是因为你没有选择正确的元素$data['fetchers']['fetcher']
是一个数组。如果需要第一个元素,请使用[0]
foreach($json['products']['product'] as $data) {
echo $data['@id'].'<br/>';
echo $data['name'].'<br/>';
echo $data['fetchers']['fetcher'][0]['@fetcherId'].'<br/>';
echo $data['fetchers']['fetcher'][0]['link1'].'<br/>';
echo $data['fetchers']['fetcher'][0]['link2'].'<br/>';
}
foreach($json['products']['product']作为$data){
echo$data['@id'].
;
echo$data['name'].
;
echo$data['fetchers']['fetcher'][0]['@fetcherId'].
;
echo$data['fetchers']['fetcher'][0]['link1'].
;
echo$data['fetchers']['fetcher'][0]['link2'].
;
}
另外,不要忘记在HTML上下文中使用的任意数据周围使用htmlspecialchars()
。这与JSON数据无关,您可以通过这种方式正确访问它们。考虑这个例子:
$json_string = '{"products":{"product":[{"@id":"1","name":"First Name","fetchers":{"fetcher":[{"@fetcherId":"1","link1":"http:\/\/www.example.com\/pv\/?1&NAME=[[first-name\/1\/?refID=1\/first-name]]&denk5=[[1]]","link2":"http:\/\/www.example.com\/pc\/?1&NAME=[[first-name\/1\/?refID=1\/first-name]]&denk5=[[1]]"}]}},{"@id":"2","name":"Second Name","fetchers":{"fetcher":[{"@fetcherId":"2","link1":"http:\/\/www.example.com\/pv\/?1&NAME=[[second-name\/2\/?refID=2\/second-name]]&denk5=[[2]]","link2":"http:\/\/www.example.com\/pc\/?1&NAME=[[second-name\/2\/?refID=2\/second-name]]&denk5=[[2]]"}]}}]}}';
$json_data = json_decode($json_string, true);
$data = array();
foreach($json_data['products']['product'] as $key => $value) {
echo '@id => ' . $value['@id'] . '<br/>';
echo 'name => ' .$value['name'] . '<br/>';
if(isset($value['fetchers'])) {
$fetchers = reset($value['fetchers']['fetcher']); // <-- set pointer to first which is zero index
echo 'fetcher_id => ' . $fetchers['@fetcherId'] . '<br/>';
echo 'link1 => ' . $fetchers['link1'] . '<br/>';
echo 'link2 => ' . $fetchers['link2'] . '<br/>';
}
echo '<br/>';
}
?>
这与JSON数据无关,您可以通过这种方式正确访问它们。考虑这个例子:
$json_string = '{"products":{"product":[{"@id":"1","name":"First Name","fetchers":{"fetcher":[{"@fetcherId":"1","link1":"http:\/\/www.example.com\/pv\/?1&NAME=[[first-name\/1\/?refID=1\/first-name]]&denk5=[[1]]","link2":"http:\/\/www.example.com\/pc\/?1&NAME=[[first-name\/1\/?refID=1\/first-name]]&denk5=[[1]]"}]}},{"@id":"2","name":"Second Name","fetchers":{"fetcher":[{"@fetcherId":"2","link1":"http:\/\/www.example.com\/pv\/?1&NAME=[[second-name\/2\/?refID=2\/second-name]]&denk5=[[2]]","link2":"http:\/\/www.example.com\/pc\/?1&NAME=[[second-name\/2\/?refID=2\/second-name]]&denk5=[[2]]"}]}}]}}';
$json_data = json_decode($json_string, true);
$data = array();
foreach($json_data['products']['product'] as $key => $value) {
echo '@id => ' . $value['@id'] . '<br/>';
echo 'name => ' .$value['name'] . '<br/>';
if(isset($value['fetchers'])) {
$fetchers = reset($value['fetchers']['fetcher']); // <-- set pointer to first which is zero index
echo 'fetcher_id => ' . $fetchers['@fetcherId'] . '<br/>';
echo 'link1 => ' . $fetchers['link1'] . '<br/>';
echo 'link2 => ' . $fetchers['link2'] . '<br/>';
}
echo '<br/>';
}
?>
不幸的是,这总是给我第一次迭代@fetcherId,link1和link2。。。(id 1),并且不通过foreach。没有硬编码迭代编号的其他方法吗?@DKOATED您的数据中只有一个。如果相关,请添加更多。是的,你所要做的就是在你的foreach
中有另一个foreach
循环foreach($data['fetchers']['fetcher']作为$fetcher)
我的foreach可以很好地处理这两种产品/产品(请参见上面我的输出)。只是两次迭代中的link1和link2都没有出现。。。也许我只是完全误解了。。。我可以计算迭代次数并使用迭代次数设置[0]?看起来真的很黑…我做了:这是我的输出:1,名字,1,link1/pv/?1&;NAME=[[first NAME/1/?refID=1/first NAME]]&;denk5=[[1]],链接2/pc/?1&;NAME=[[first NAME/1/?refID=1/first NAME]]&;denk5=[[1]]2,第二个名字,2,link1/pv/?1&;NAME=[[first NAME/1/?refID=1/first NAME]]&;denk5=[[1]],链接2/pc/?1&;NAME=[[first NAME/1/?refID=1/first NAME]]&;denk5=[[1]]@DKOATED如果您尝试一下,它会起作用。我把它放在代码板上给你们看:它一点都不黑。。。你的数据乱七八糟。如果您的数据采用的是这种格式,那么您必须这样做。如果在fetcher
中实际有多个元素,只需像我所说的那样添加一个foreach
循环。不幸的是,这总是给我第一次迭代@fetcherId,link1和link2。。。(id 1),并且不通过foreach。没有硬编码迭代编号的其他方法吗?@DKOATED您的数据中只有一个。如果相关,请添加更多。是的,你所要做的就是在你的foreach
中有另一个foreach
循环foreach($data['fetchers']['fetcher']作为$fetcher)
我的foreach可以很好地处理这两种产品/产品(请参见上面我的输出)。只是两次迭代中的link1和link2都没有出现。。。也许我只是完全误解了。。。我可以计算迭代次数并使用迭代次数设置[0]?看起来真的很黑…我做了:这是我的输出:1,名字,1,link1/pv/?1&;NAME=[[first NAME/1/?refID=1/first NAME]]&;denk5=[[1]],链接2/pc/?1&;NAME=[[first NAME/1/?refID=1/first NAME]]&;denk5=[[1]]2,第二个名字,2,link1/pv/?1&;NAME=[[first NAME/1/?refID=1/first NAME]]&;denk5=[[1]],链接2/pc/?1&;NAME=[[first NAME/1/?refID=1/first NAME]]&;denk5=[[1]]@DKOATED如果您尝试一下,它会起作用。我把它放在代码板上给你们看:它一点都不黑。。。你的数据乱七八糟。如果您的数据采用的是这种格式,那么您必须这样做。如果你在fetcher
中实际有多个元素,只需像我说的那样添加一个foreach
循环。谢谢@kevinabelita,Brad的解决方案在我这边非常有效。谢谢@kevinabelita,Brad的解决方案在我这边非常有效。