Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.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 以[foreach]开头的Json警告_Php_Json_Decode - Fatal编程技术网

Php 以[foreach]开头的Json警告

Php 以[foreach]开头的Json警告,php,json,decode,Php,Json,Decode,我需要获取一些json代码;它以[ 如果我尝试循环它,我将检索 警告:为foreach()提供的参数无效 有人能帮我正确解码这个json吗?谢谢 PHP代码: echo "<h2>Tradedoubler Coupon</h2>"; $tdjson = file_get_contents("http://api.tradedoubler.com/1.0/vouchers.json;voucherTypeId=1?token=280C407EC3D32D2C8E4C04A1

我需要获取一些json代码;它以
[

如果我尝试循环它,我将检索

警告:为foreach()提供的参数无效

有人能帮我正确解码这个json吗?谢谢

PHP代码:

echo "<h2>Tradedoubler Coupon</h2>";
$tdjson = file_get_contents("http://api.tradedoubler.com/1.0/vouchers.json;voucherTypeId=1?token=280C407EC3D32D2C8E4C04A100DD00FEA9000580");
//$tdobj = json_decode(print_r($tdjson));
$tdobj = json_decode($tdjson,true);
//foreach($tdobj as $prog ) {
echo '<ul>';
echo '<li>' . print_r($tdobj) . '</li>
</ul>';

来自Tradedoubler的JSON无效。问题是它没有在对象属性名称周围加双引号,只有值

以此为例:

$json = '[
    {
        "id": 20108,
        "programId": 17269,
        "programName": "",
        "code": "6G4KGGDH"
    },
    {
        "id": 19699,
        "programId": 29519,
        "programName": "",
        "code": "6G4KGGDH"
    }
]';

print_r(json_decode($json));
在上面的JSON中,我添加了必要的双引号,如果您运行该代码,您将看到它将成功输出:

Array
(
    [0] => stdClass Object
        (
            [id] => 20108
            [programId] => 17269
            [programName] => 
            [code] => 6G4KGGDH
        )

    [1] => stdClass Object
        (
            [id] => 19699
            [programId] => 29519
            [programName] => 
            [code] => 6G4KGGDH
        )

)
因此,您有两种选择:

  • 联系Tradedoubler并请求他们提供有效的JSON
  • 解析缺少引号的属性名称并插入它们,这将更正原始的无效JSON


  • 如果您想测试JSON片段是否有效,您可以将其粘贴到其中,它会告诉您错误在哪里。如果您从tradedoubler粘贴JSON,它确实会告诉您它无效。

    最后我有一个解决方案:tradedoubler还提供凭证文件的xml版本,因此您可以使用curl对其进行解码:

        <?php
    
    $url="http://api.tradedoubler.com/1.0/vouchers?token=YOURTOKEN";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);    // get the url contents
    
    $data = curl_exec($ch); // execute curl request
    curl_close($ch);
    
    $xml = simplexml_load_string($data);
    print_r($xml);
    
    ?>
    
    
    
    和循环结果:

    <?php
    
    $url="http://api.tradedoubler.com/1.0/vouchers?token=YOUR TOKEN HERE";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);    // get the url contents
    
    $data = curl_exec($ch); // execute curl request
    curl_close($ch);
    
    $xml = simplexml_load_string($data);
    foreach ($xml->voucher as $coupon){
    echo '<li>'.$coupon->id.' - '.$coupon->programId.' - '.$coupon->programName.' - '.$coupon->code.' - '.$coupon->title.' - '.$coupon->shortDescription.' - '.$coupon->description.'</li>';
    }
    
    ?> 
    
    凭证作为$优惠券){
    回显“
  • ”.$coupon->id.-”.$coupon->programmaid.-“.$coupon->programmaname.-”.$coupon->code.-“.$coupon->title.-”.$coupon->shortDescription.-“.$coupon->description.-”
  • ; } ?>
    var_dump($tdobj)
    ,你得到了什么?你正在解码JSON字符串,因此$JSON应该看起来像字符串而不是对象。用引号将内容包装成字符串。var_dump($tdobj)=bool(true)尝试在JSON周围添加单引号。在最近的PHP版本中,他们添加了对
    []的支持
    array notation,因此在缺少引号的情况下,您的数据可能会被解析到此处,然后发布您的实际代码。@Pigi只是一个很好的支持者,如果他的答案有用,请进行投票和/或接受。最后我有了解决方案:Tradedoubler还提供了凭证文件的xml版本,因此使用curl您可以对其进行解码:
    <?php
    
    $url="http://api.tradedoubler.com/1.0/vouchers?token=YOUR TOKEN HERE";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);    // get the url contents
    
    $data = curl_exec($ch); // execute curl request
    curl_close($ch);
    
    $xml = simplexml_load_string($data);
    foreach ($xml->voucher as $coupon){
    echo '<li>'.$coupon->id.' - '.$coupon->programId.' - '.$coupon->programName.' - '.$coupon->code.' - '.$coupon->title.' - '.$coupon->shortDescription.' - '.$coupon->description.'</li>';
    }
    
    ?>