热搜:NVER node 开发 php

PHP使用json为何总是报错

2024-07-23 12:15:01
PHP使用json为何总是报错

<?php

$res = '{

    "status": "ok", //接口状态,参考http://www.heweather.com/documents/api 
               
    "basic": {  //基本信息
        "city": "北京",  //城市名称
        "cnty": "中国",  //国家
        "id": "CN101010100",  //城市ID,参见http://www.heweather.com/documents/cn-city-list
        "lat": "39.904000",  //城市维度
        "lon": "116.391000",  //城市经度
        "update": {  //更新时间
            "loc": "2015-07-02 14:44", //当地时间
            "utc": "2015-07-02 06:46"  //UTC时间
        }
    }
}';

var_dump(json_decode($res));      //显示结果

// $json = '{"foo": 12345}';
// $obj = json_decode($json);
// print $obj->{'foo'}; // 12345
?>


抱的错都是类似syntax error, unexpected 'status' (T_STRING) in /Applications/MAMP/htdocs/testjson.php on line 5


回复讨论(解决方案)

你的代码就这些?那把json里面注释去掉。。。

你的代码就这些?那把json里面注释去掉。。。


好像去掉注释真的可以显示出来了,大概是这样的
object(stdClass)#1 (2) 
{   
["status"]=> string(2) "ok" 
["basic"]=> object(stdClass)#2 (6) 
{   
["city"]=> string(6) "北京" 
["cnty"]=> string(6) "中国" 
["id"]=> string(11) "CN101010100" 
["lat"]=> string(9) "39.904000" 
["lon"]=> string(10) "116.391000" 
["update"]=> object(stdClass)#3 (2) 
{   
["loc"]=> string(16) "2015-07-02 14:44" 
["utc"]=> string(16) "2015-07-02 06:46" 


}

排好版之后的样子,那比如说 $res = json_decode($res) 之后应该怎么提取这个数组里面的“id”的值呢

$obj->basic->id

json_decode($json, true);
出来的就是数组了

好像不行,这样没法提取单个数据值

当我从一个URL获取了json包之后,$res = curl_exec($ch);    不论怎么处理,整个json包都会展现出来,而不是我想要提取的其中某个字段

<?php
    $ch = curl_init();
    $url = 'https://api.heweather.com/x3/weather?cityid=CN101200101&key=7081f8010abe4638a86e0c4c1cfee30e';
    // 执行HTTP请求
    curl_setopt($ch , CURLOPT_URL , $url);
    curl_setopt($ch , CURLOPT_SSL_VERIFYPEER , false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $res = json_decode(curl_exec($ch));
    echo $res['now']['cond']['txt'];
 ?>

这段请求无法获取到需要的天气值

echo $res[key($res)][0]['now']['cond']['txt']; //多云

其实你 print_r($res); 就可以看到 now 是在第三维的

注释去掉即可

$res = '{    "status": "ok",                   "basic": {        "city": "北京",        "cnty": "中国",        "id": "CN101010100",        "lat": "39.904000",        "lon": "116.391000",        "update": {            "loc": "2015-07-02 14:44",            "utc": "2015-07-02 06:46"        }    }}';var_dump(json_decode($res));      //显示结果


object(stdClass)[1]
public 'status' => string 'ok' (length=2)
public 'basic' =>
object(stdClass)[2]
public 'city' => string '北京' (length=6)
public 'cnty' => string '中国' (length=6)
public 'id' => string 'CN101010100' (length=11)
public 'lat' => string '39.904000' (length=9)
public 'lon' => string '116.391000' (length=10)
public 'update' =>
object(stdClass)[3]
public 'loc' => string '2015-07-02 14:44' (length=16)
public 'utc' => string '2015-07-02 06:46' (length=16)


获取id可以这样写

$res = '{    "status": "ok",                   "basic": {        "city": "北京",        "cnty": "中国",        "id": "CN101010100",        "lat": "39.904000",        "lon": "116.391000",        "update": {            "loc": "2015-07-02 14:44",            "utc": "2015-07-02 06:46"        }    }}';$data = json_decode($res);      //显示结果echo $data->basic->id;


CN101010100

echo $res[key($res)][0]['now']['cond']['txt']; //多云

其实你 print_r($res); 就可以看到 now 是在第三维的


好像还是不行,刚才试了一下你这个,也不能输出任何东西

注释去掉即可

$res = '{    "status": "ok",                   "basic": {        "city": "北京",        "cnty": "中国",        "id": "CN101010100",        "lat": "39.904000",        "lon": "116.391000",        "update": {            "loc": "2015-07-02 14:44",            "utc": "2015-07-02 06:46"        }    }}';var_dump(json_decode($res));      //显示结果


object(stdClass)[1]
public 'status' => string 'ok' (length=2)
public 'basic' =>
object(stdClass)[2]
public 'city' => string '北京' (length=6)
public 'cnty' => string '中国' (length=6)
public 'id' => string 'CN101010100' (length=11)
public 'lat' => string '39.904000' (length=9)
public 'lon' => string '116.391000' (length=10)
public 'update' =>
object(stdClass)[3]
public 'loc' => string '2015-07-02 14:44' (length=16)
public 'utc' => string '2015-07-02 06:46' (length=16)


获取id可以这样写

$res = '{    "status": "ok",                   "basic": {        "city": "北京",        "cnty": "中国",        "id": "CN101010100",        "lat": "39.904000",        "lon": "116.391000",        "update": {            "loc": "2015-07-02 14:44",            "utc": "2015-07-02 06:46"        }    }}';$data = json_decode($res);      //显示结果echo $data->basic->id;


CN101010100



麻烦看一下我7楼的代码,从中如何提取天气的txt

$ch = curl_init();$url = 'https://api.heweather.com/x3/weather?cityid=CN101200101&key=7081f8010abe4638a86e0c4c1cfee30e';// 执行HTTP请求curl_setopt($ch , CURLOPT_URL , $url);curl_setopt($ch , CURLOPT_SSL_VERIFYPEER , false);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$res = json_decode(curl_exec($ch), true); //json_decode 要有第二个参数,这样可解析成数组echo $res[key($res)][0]['now']['cond']['txt'], PHP_EOL; //为什么要这样写,看看 print_r 的输出就知道了print_r($res);