【问题标题】:JSON-PHP:parse multiple object with the same nameJSON-PHP:解析多个同名对象
【发布时间】:2014-09-24 12:09:51
【问题描述】:

我遇到了这个问题:我正在尝试显示来自 Weatherground 的天气信息,我收到了以下回复:

{
"response": {
"version":"0.1",
"termsofService":"http://www.wunderground.com/weather/api/d/terms.html",
"features": {
"forecast": 1
}
  }
    ,
  "forecast":{
    "txt_forecast": {
    "date":"10:52 CEST",
    "forecastday": [
    {
    "period":0,
    "icon":"tstorms",
    "icon_url":"http://icons.wxug.com/i/c/k/tstorms.gif",
    "title":"Venerdì",
    "fcttext":"Temporali. Max: 79º F. Venti da S variabili. Prob. pioggia: 80%.",
    "fcttext_metric":"Temporali. Max: 26º C. Venti da S variabili. Prob. pioggia: 80%.",
    "pop":"80"
    }
    ,
    {
    "period":1,
    "icon":"nt_rain",
    "icon_url":"http://icons.wxug.com/i/c/k/nt_rain.gif",
    "title":"Venerdì notte",
    "fcttext":"Pioggia e tuoni. Min: 62º F. Venti da ENE variabili. Prob. pioggia: 60%.",
    "fcttext_metric":"Pioggia e tuoni. Min: 17º C. Venti da ENE variabili. Prob. pioggia: 60%.",
    "pop":"60"
    }
    ,
    {
    "period":2,
    "icon":"tstorms",
    "icon_url":"http://icons.wxug.com/i/c/k/tstorms.gif",
    "title":"Sabato",
    "fcttext":"Temporali. Max: 75º F. Venti da SSE variabili. Prob. pioggia: 90%.",
    "fcttext_metric":"Temporali. Max: 24º C. Venti da SSE variabili. Prob. pioggia: 90%.",
    "pop":"90"
    }

使用此代码:

    <?php
    $json_string =   file_get_contents("http://api.wunderground.com/api/***/forecast/lang:IT/q/SW/Lugano.json");
     $parsed_json = json_decode($json_string);
     $date = $parsed_json->{'forecast'}->{'txt_forecast'}->{'date'};
     $named0 = $parsed_json->{'forecast'}->{'txt_forecast'}->{'forecastday'}->{'title'};
     $txtd0 = $parsed_json->{'forecast'}->{'txt_forecast'}->{'forecastday'}->{'fcttext'};

echo "$named0, $date: $txtd0";
 ?>

(我想得到类似:星期五,10:52CEST:下雨天......)

但问题是我无法显示预测,因为第二个时期 (period:1) 的值与第一个时期的名称相同。

我试图将链接放在http://jsonformatter.curiousconcept.com/ 中,但它只是向我展示了这一点: ...

"forecastday":[  
            {  
               "period":0,
               "icon":"tstorms",
               "icon_url":"http://icons.wxug.com/i/c/k/tstorms.gif",
               "title":"Venerdì",
               "fcttext":"Temporali. Max: 79º F. Venti da S variabili. Prob. pioggia: 80%.",
               "fcttext_metric":"Temporali. Max: 26º C. Venti da S variabili. Prob. pioggia: 80%.",
               "pop":"80"
            },
            {  },
            {  },
            {  },
            {  },
            {  },
            {  },
            {  }

所以问题是,我怎样才能像这样分开不同的时期:

period0: $named0, $date: $txtd0

period1: $named1, $date: $txtd1
....

因为在代码中我看不到响应的第一个或第二个“标题”

$named0 = $parsed_json->{'forecast'}->{'txt_forecast'}->{'forecastday'}->{'title'};

$named0 必须获取第一个 'title' 的值

谢谢你,对不起我的英语和我的编码技能,我还是个新手

【问题讨论】:

    标签: php json parsing weather-api


    【解决方案1】:

    'forecastday'被解码为数组,所以你可以通过以下方式访问它:

    $name1 = $parsed_json->forecast->forecastday[1]->name;
    

    我你的符号(没有使用/尝试过)可能是:

    $name1 = $parsed_json->{'forecast'}->{'txt_forecast'}->{'forecastday'}[1]->{'title'};
    

    (括号不进入字符串/'...') 但是,forecastday 是一个数组,其他都是 Objects...

    【讨论】:

    • 我必须使用括号吗?像这样: $name0= $parsed_json->{'forecast'}->{'txt_forecast'}->{'forecastday[0]'}->{'title'};
    • 谢谢!信息:所有这 3 个工作: $name = $parsed_json->{'forecast'}->{'txt_forecast'}->{'forecastday'}[0]->{'title'}; /// $name = $parsed_json->{'forecast'}->{'txt_forecast'}->forecastday[0]->{'title'}; /// $name = $parsed_json->forecast->txt_forecast->forecastday[0]->title;
    【解决方案2】:

    像这样:

      $data = json_decode('{"response": {"version":"0.1","termsofService":"http://www.wunderground.co/weather/api/d/terms.html","features": {"forecast": 1}},"forecast":{"txt_forecast": {"date":"10:52 CEST", "forecastday": [{"period":0,"icon":"tstorms","icon_url":"http://icons.wxug.com/i/c/k/tstorms.gif", "title":"Venerdì", "fcttext":"Temporali. Max: 79º F. Venti da S variabili. Prob. pioggia: 80%.","fcttext_metric":"Temporali. Max: 26º C. Venti da S variabili. Prob. pioggia: 80%.","pop":"80"},{"period":1,"icon":"nt_rain","icon_url":"http://icons.wxug.com/i/c/k/nt_rain.gif","title":"Venerdì notte","fcttext":"Pioggia e tuoni. Min: 62º F. Venti da ENE variabili. Prob. pioggia: 60%.","fcttext_metric":"Pioggia e tuoni. Min: 17º C. Venti da ENE variabili. Prob. pioggia: 60%.","pop":"60"},{"period":2,"icon":"tstorms","icon_url":"http://icons.wxug.com/i/c/k/tstorms.gif","title":"Sabato","fcttext":"Temporali. Max: 75º F. Venti da SSE variabili. Prob. pioggia: 90%.","fcttext_metric":"Temporali. Max: 24º C. Venti da SSE variabili. Prob. pioggia: 90%.","pop":"90"}]}}}');
    
    
      foreach ($data->forecast->txt_forecast->forecastday as $forecast)
      {
          echo printf("%s, %s, %s<br/>", $forecast->title, $data->forecast->txt_forecast->date, $forecast->fcttext);
      }
    

    【讨论】:

      【解决方案3】:

      即使您将 json_decode 作为对象,您也可以像处理数组一样循环 forecastday。

      foreach( $parsed_json->response->forecast->txt_forecast->forecastday as $key=> $day )
      {
          print( 'Period' . $day->period . ': ' );
          print( $day->title . ', ' );
          print( $parsed_json->response->forecast->txt_forecast->date . ' ' );
          print( $day->fcttext );
      }
      

      或者你可以像这样直接访问它:

      $forecastzerotitle = $parsed_json->response->forecast->txt_forecast->forecastday[0]->title );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-11
        • 1970-01-01
        • 2015-07-16
        • 2013-08-13
        • 1970-01-01
        • 2017-09-13
        相关资源
        最近更新 更多