2010-10-27 49 views
26

Tôi đã cố gắng yêu cầu thời tiết từ một dịch vụ web cung cấp dữ liệu ở định dạng JSON. Mã yêu cầu PHP của tôi không thành công:Phân tích cú pháp đối tượng JSON trong PHP bằng cách sử dụng json_decode

$url="http://www.worldweatheronline.com/feed/weather.ashx?q=schruns,austria&format=json&num_of_days=5&key=8f2d1ea151085304102710"; 
$json = file_get_contents($url); 
$data = json_decode($json, TRUE); 
echo $data[0]->weather->weatherIconUrl[0]->value;  

Đây là một số dữ liệu được trả về. Một số chi tiết đã được cắt ngắn cho ngắn gọn, nhưng toàn vẹn đối tượng được giữ lại:

{ "data": 
    { "current_condition": 
     [ { "cloudcover": "31", 
      ... } ], 
     "request": 
     [ { "query": "Schruns, Austria", 
      "type": "City" } ], 
     "weather": 
     [ { "date": "2010-10-27", 
      "precipMM": "0.0", 
      "tempMaxC": "3", 
      "tempMaxF": "38", 
      "tempMinC": "-13", 
      "tempMinF": "9", 
      "weatherCode": "113", 
      "weatherDesc": [ {"value": "Sunny" } ], 
      "weatherIconUrl": [ {"value": "http:\/\/www.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0001_sunny.png" } ], 
      "winddir16Point": "N", 
      "winddirDegree": "356", 
      "winddirection": "N", 
      "windspeedKmph": "5", 
      "windspeedMiles": "3" }, 
      { "date": "2010-10-28", 
      ... }, 

      ... ] 
     } 
    } 
} 
+11

Bạn đã thử những gì? Cái gì không hiệu quả? Bạn có biết 'json_decode()'? http://www.php.net/json_Decode –

+1

@Ben Lee, nó được ưu tiên là SO trả lời các câu hỏi đó và do đó thay thế Google làm nguồn mặc định cho các câu hỏi về dev. [ref meta] (http://meta.stackexchange.com/questions/8724/how-to-deal-with-google-questions) – jball

+0

@jball, tôi rất hữu ích. Pekka đã trả lời câu hỏi, và tôi đang theo dõi. Tôi không có vấn đề với những người đăng câu hỏi đơn giản trên SO, và họ * nên * nhận được câu trả lời cho họ. Nhưng đối với một câu hỏi đơn giản này họ gần như chắc chắn sẽ có được kết quả nhanh hơn nếu họ tìm kiếm đầu tiên - và nó không làm tổn thương để cho họ biết điều này. Tôi đọc qua bài viết trong liên kết bạn cung cấp và tôi đồng ý với hầu hết nó, nhưng tôi cũng không đồng ý rằng SO nên * supercede * google. Tôi nghĩ rằng họ nên được sử dụng song song, và tôi nghĩ rằng nó giúp OP biết khi google là hiệu quả nhất. –

Trả lời

49

Điều này dường như làm việc:

$url = 'http://www.worldweatheronline.com/feed/weather.ashx?q=schruns,austria&format=json&num_of_days=5&key=8f2d1ea151085304102710%22'; 
$content = file_get_contents($url); 
$json = json_decode($content, true); 

foreach($json['data']['weather'] as $item) { 
    print $item['date']; 
    print ' - '; 
    print $item['weatherDesc'][0]['value']; 
    print ' - '; 
    print '<img src="' . $item['weatherIconUrl'][0]['value'] . '" border="0" alt="" />'; 
    print '<br>'; 
} 

Nếu bạn đặt tham số thứ hai của json_decode true, bạn sẽ có được một mảng, vì vậy bạn không thể sử dụng -> cú pháp. Tôi cũng khuyên bạn nên cài đặt JSONview Firefox extension, vì vậy bạn có thể xem các tài liệu json được tạo trong một khung nhìn cây được định dạng đẹp tương tự như cách Firefox hiển thị cấu trúc XML. Điều này làm cho mọi thứ trở nên dễ dàng hơn nhiều.

+0

Tôi đã có một json lồng nhau tương tự sâu đã giết chết tôi một khi tôi chuyển đổi nó thành một mảng. Tôi không thể tìm ra cách thích hợp để đi sâu vào mảng để đến được món đồ tôi cần. Có vẻ dễ dàng, nhưng là một người khá mới mẻ với php, giải pháp đơn giản của bạn chính xác là những gì tôi cần. Cảm ơn! – Scooter

+0

Cảm ơn bạn nó hoạt động cho tôi –

4

Có vẻ như bạn quên [ "giá trị"] hoặc ->value:

echo $data[0]->weather->weatherIconUrl[0]->value; 
45

Nếu bạn sử dụng lệnh sau:

$json = file_get_contents($url); 
$data = json_decode($json, TRUE); 

Các TRUE trả về một mảng thay vì một vật.

+3

Cảm ơn bạn rất nhiều, tôi đã thiếu tham số TRUE –

0

Bạn phải đảm bảo trước rằng máy chủ của bạn cho phép kết nối từ xa để chức năng file_get_contents($url) hoạt động tốt, hầu hết máy chủ tắt tính năng này vì lý do bảo mật.

0

Trong khi chỉnh sửa mã (vì OCD nhẹ), tôi nhận thấy rằng thời tiết cũng là một danh sách. Bạn có thể nên xem xét một cái gì đó như

echo $data[0]->weather[0]->weatherIconUrl[0]->value; 

để đảm bảo bạn đang sử dụng weatherIconUrl cho phiên bản ngày chính xác.

Các vấn đề liên quan