在PHP中,JSON在特殊字符上返回空?

在PHP中,JSON在特殊字符上返回空?,php,json,Php,Json,我试图显示JSON中的一些值,但有两个显示失败,而其余的则工作正常。我怀疑这与里面的人物有关,但不知道如何继续 尝试过的技巧: UTF-8-ing一切 直接正则化JSON 解码,用JSON_PRETTY_PRINT/JSON_UNESCAPED_UNICODE编码,然后再次解码 还有一些我再也记不起来了 任何关于如何解决这一问题的建议都将受到高度赞赏: var_转储$json { "products":{ "product":[{ "@id":"1

我试图显示JSON中的一些值,但有两个显示失败,而其余的则工作正常。我怀疑这与里面的人物有关,但不知道如何继续

尝试过的技巧:

  • UTF-8-ing一切
  • 直接正则化JSON
  • 解码,用JSON_PRETTY_PRINT/JSON_UNESCAPED_UNICODE编码,然后再次解码
  • 还有一些我再也记不起来了
  • 任何关于如何解决这一问题的建议都将受到高度赞赏:

    var_转储$json

    {
        "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&amp;NAME=[[first-name/1/?refID=1/first-name]]&amp;denk5=[[1]]
    http://www.example.com/pc/?1&amp;NAME=[[first-name/1/?refID=1/first-name]]&amp;denk5=[[1]]
    2
    Second Name
    2
    http://www.example.com/pv/?1&amp;NAME=[[second-name/2/?refID=2/second-name]]&amp;denk5=[[2]]
    http://www.example.com/pc/?1&amp;NAME=[[second-name/2/?refID=2/second-name]]&amp;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&amp;NAME=[[first-name\/1\/?refID=1\/first-name]]&amp;denk5=[[1]]","link2":"http:\/\/www.example.com\/pc\/?1&amp;NAME=[[first-name\/1\/?refID=1\/first-name]]&amp;denk5=[[1]]"}]}},{"@id":"2","name":"Second Name","fetchers":{"fetcher":[{"@fetcherId":"2","link1":"http:\/\/www.example.com\/pv\/?1&amp;NAME=[[second-name\/2\/?refID=2\/second-name]]&amp;denk5=[[2]]","link2":"http:\/\/www.example.com\/pc\/?1&amp;NAME=[[second-name\/2\/?refID=2\/second-name]]&amp;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&amp;NAME=[[first-name\/1\/?refID=1\/first-name]]&amp;denk5=[[1]]","link2":"http:\/\/www.example.com\/pc\/?1&amp;NAME=[[first-name\/1\/?refID=1\/first-name]]&amp;denk5=[[1]]"}]}},{"@id":"2","name":"Second Name","fetchers":{"fetcher":[{"@fetcherId":"2","link1":"http:\/\/www.example.com\/pv\/?1&amp;NAME=[[second-name\/2\/?refID=2\/second-name]]&amp;denk5=[[2]]","link2":"http:\/\/www.example.com\/pc\/?1&amp;NAME=[[second-name\/2\/?refID=2\/second-name]]&amp;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的解决方案在我这边非常有效。