OpenWeather API - 提取 JSON 数据

Posted

技术标签:

【中文标题】OpenWeather API - 提取 JSON 数据【英文标题】:OpenWeather API - Pulling JSON data out 【发布时间】:2013-09-25 22:13:22 【问题描述】:

我正在编写一个小 javascript 来从 JSON 中提取包含名称、经度、纬度和 openweather API 调用的信息。我需要的是从 API 调用中获取 API 信息到 html 页面中,这样您就可以获取每个信息的天气预报。我让这两个元素分开工作,但不知道如何让它们一起工作。

请帮忙? :-)

来自 d.weather 的示例 API 天气

 api.openweathermap.org/data/2.5/forecase?lat=50.8609&lon=-0.08014&&units=metric

用于提取 openweather JSON 数据的 HTML 页面

<html>
<head>
<title>Weather</title>
    <meta charset="utf-8">

    <script src="http://code.jquery.com/jquery-1.7.min.js" ></script>
    <script src="http://code.jquery.com/ui/1.7.0/jquery-ui.js" ></script>

<script>
function getWeather(callback) 
    var weather = 'http://api.openweathermap.org/data/2.5/forecast?lat=51.5072&lon=0.1275&units=metric';
    $.ajax(
      dataType: "jsonp",
      url: weather,
      success: callback
    );


// get data:
getWeather(function (data) 
    console.log('weather data received');
    console.log(data.list[0].weather[0].description); 
    console.log(data.list[0].weather[0].main);  
);

getWeather(function (data) 
    document.write('weather data received');
    document.write('<br>');
    document.write(data.list[0].weather[0].description);
    document.write('<br>');
    document.write(data.list[0].weather[0].main);
    document.write('<br>');
    document.write(data.list[0].main.temp);
    document.write('<br>');
    document.write(data.list[0].main[0].dt_txt);
    document.write('<br>');
);
</script>
</body>
</html>

用于提取 JSON 数据的 HTML 页面

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.10.0.min.js"></script> 
<!-- Javascript -->

<script type="text/javascript">
function loadUrl(newLocation)
    window.location = newLocation;
    return false;

</script>

<script type="text/javascript">
$(document).ready(function ()
    $("#btn382").click(function()       
        /* set no cache */
        $.ajaxSetup( cache: false );

        $.getJSON("weather.json", function(data)
            var html = [];

            /* loop through array */
            $.each(data, function(index, d)           
                html.push("Team : ", d.Teams, ", ",
                          "Long : ", d.Long, ", ",
                          "Lat : ", d.Lat, ", ",
              "Weather : ", d.Weather, "<br>");        
            );


            $("#div381").html(html.join('')).css("background-color", "orange");
        ).error(function(jqXHR, textStatus, errorThrown) /* assign handler */
            /* alert(jqXHR.responseText) */
            alert("error occurred!");
        );
    );
);
</script>

<!-- HTML -->
<a name="#ajax-getjson-example"></a>
<div id="example-section38">   
    <div>Football weather</div>
    <div id="div381"></div>
    <button id="btn382" type="button">Team location</button>
</div>

天气.json


    "Teams":"Wycombe Wanderers",
    "Long":-0.800299,
    "Lat":51.6306,
    "Weather":"  api.openweathermap.org/data/2.5/weather?lat=51.6306&lon=-0.800299&mode=html"
  ,
  
    "Teams":"Livingston",
    "Long":-3.52207,
    "Lat":55.8864,
    "Weather":"  api.openweathermap.org/data/2.5/weather?lat=55.8864&lon=-3.52207&mode=html"
  ,
  
    "Teams":"Brighton and Hove Albion",
    "Long":-0.08014,
    "Lat":50.8609,
    "Weather":"  api.openweathermap.org/data/2.5/weather?lat=50.8609&lon=-0.08014&mode=html"
  ,

【问题讨论】:

你能把这些添加到 jsfiddle 中吗? 等等,你从哪里得到teams?这不会出现在天气数据中。你的意思是city 嗨,安迪,团队来自我手动输入该字段的 json 文件 但是这里的某个地方你似乎合并了天气 json 和团队 json,但我看不出这是在哪里发生的。 我有两个 html 在理论上作为单独的页面工作,团队 json 应该是第二个 html 页面中的手动文件,而天气 json 是我相信的 api 数据调用 【参考方案1】:

我有一些基础知识,应该可以帮助你。这是您的两个页面的混搭。

首先,我修改了您的 getWeather 函数以调用天气而不是预报。它接受city 参数,并在调用回调之前将该参数附加到数据中。

function getWeather(city, callback) 
  var url = 'http://api.openweathermap.org/data/2.5/weather';
  $.ajax(
    dataType: "jsonp",
    url: url,
    jsonCallback: 'jsonp',
    data:  q: city ,
    cache: false,
    success: function (data) 
        data.city = city;
        callback(data);
    
  );

在这里,我以 JS 对象的形式代替了您的球队 JSON,以阿森纳和利物浦及其对应的城市作为数据。该函数遍历对象,提取城市名称并将其传递给getWeather。数据返回并附加到 div。

$(document).ready(function () 

  $("#btn382").click(function () 

    var teams = 
      arsenal:  city: 'london' ,
      liverpool:  city: 'liverpool' 
    ;

    for (var team in teams) 
      var city = teams[team].city;
      getWeather(city, function(data) 
        var html = [];
        html.push('<div>')
        html.push('City: ', data.city, ', ');
        html.push('Lat: ', data.coord.lat, ', ');
        html.push('Lon: ', data.coord.lon, ', ');
        html.push('Weather: ', data.weather[0].description);
        html.push('</div>')
        $("#div381").append(html.join('')).css("background-color", "orange");
      );
    

  );
);

希望这会给你一些关于如何处理这个项目的想法。

See it working here.

【讨论】:

安迪感谢您的所有帮助,我可以看到您有什么,这是一个很大的帮助 - 我已经添加了 weather.json,这样您就可以看到我正在尝试做什么 如果这是最佳答案,可以点勾吗? @Grimlockz,我已经用与您添加的团队信息相关的代码更新了小提琴。我还没有更新答案。 太棒了 - 感谢您在这方面的帮助 - 我喜欢 jsfiddle.net 顺便说一句【参考方案2】:

你为什么不使用xml而不是json它很容易解析,我在我的网站weathercase中使用它,尝试api提供者yr.no

【讨论】:

因为 JSON 的解析速度要快得多。效率几乎提高了 10 倍。 任何证明 JSON 更快的证据 这里有一个 Python 实验来说明我的陈述:github.com/concolato/data_processing/tree/master/…,由于 Python 是一种基于 C 的语言,我希望在 C/C++、Java 和 php 中得到类似的结果。但是,您可以尝试使用其他语言来确认您是否愿意。【参考方案3】:

我已经做了一个完整的例子。对我来说这很有效:

HTML 文件:

    <!DOCTYPE html>
    <html>
    <head>
      <script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
      <meta charset="utf-8">
      <title>jQuery Ajax</title>
      <link rel="stylesheet" href="css/ajx-json-styles.css">

      <script>
        function displayParsedData(data)
          /* Working with the 'data' object (not string) here, now we can access the different properties available.*/
          text = '<b>Name: </b>' + data.list[0].name + '<br/>';
          text += '<b>message: </b>' + data.message + '<br/>';
          text += '<b>Current Temperature: </b>' + data.list[0].main.temp + ' F<br/>';
          text += '<b>Weather Conditions: </b>' + data.list[0].weather[0].description + '<br/>';
          $('#parsed_json').append(text);
        
      </script>

      <script>
        function test1() 
          getWeather(function (data) 
              $("#raw_json").html('<h2>callback</h2><pre>' + JSON.stringify(data, null, 2) + '</pre>');
              displayParsedData(data);          
          );
        

        function getWeather(callback) 
          var weather = 'http://openweathermap.org/data/2.1/find/city?lat=8.2924495&lon=-62.7373258';
          $.ajax(
            dataType: "jsonp",
            url: weather,
            success: callback
          );
        
      </script>

      <script>
        function test2() 
          $.ajax(
            url: 'http://openweathermap.org/data/2.1/find/city?lat=8.2924495&lon=-62.7373258',
            type: 'GET',
            dataType:"jsonp",
            success: function(data) 
              $("#raw_json").html('<h2>$.ajax</h2><pre>' + JSON.stringify(data, null, 2) + '</pre>');
              displayParsedData(data);
            ,
            error: function(jqXHR, textStatus, error) 
              alert( "error: " + jqXHR.responseText);
            
          );
        
      </script>    

      <script>
        function test3() 
          $.getJSON('http://openweathermap.org/data/2.1/find/city?lat=8.2924495&lon=-62.7373258&callback=?', function(data) 
              $("#raw_json").html('<h2>getJSON</h2><pre>' + JSON.stringify(data, null, 2) + '</pre>');
              displayParsedData(data);
            )
          .done(function() 
            alert( "second success" );
          )
          .fail(function() 
            alert( "error" );
          );
        
        /*$.getJSON('http://openweathermap.org/data/2.1/find/city?lat=13.3428&lon=-6.2661&cnt=10&callback=?', function(data)  console.log(data); );*/
      </script>

      <script>
      $(document).ready(function ()
          $("#btn382").click(function()       
              /* set no cache */
              $.ajaxSetup( cache: false );

              $.getJSON("weather.json", function(data)
                  for (var team in data) 
                    var html = [];
                    html = '<div class="item"><b>Team: </b>' + data[team].Teams + '<br/>';
                    html += '<b>Lat: </b>' +data[team].Lat + '<br/>';
                    html += '<b>Lon: </b>' + data[team].Lon + '<br/>';
                    html += '<b>Weather: </b>' + data[team].Weather + '<br/></div>';
                    $("#div381").append(html);
                  
              )
              .error(function(jqXHR, textStatus, errorThrown) /* assign handler */
                  /* alert(jqXHR.responseText) */
                  alert("error occurred!");
              );
          );
      );
      </script>

    </head>
    <body>
      <div id="example-section38">   
        <div>Otra fuente</div>
        <div id="div381"></div>
        <button id="btn382" type="button">Team location</button>
      </div>

      <div id="raw_json"></div>
      <div id="parsed_json"></div>

      <button onclick="test1();">callback</button>
      <button onclick="test2();">$.ajax</button>
      <button onclick="test3();">getJSON</button>
    </body>
    </html>

weather.json

    [
    
      "Teams":"Wycombe Wanderers",
      "Lon":-0.800299,
      "Lat":51.6306,
      "Weather":"  api.openweathermap.org/data/2.5/weather?lat=51.6306&lon=-0.800299&mode=html"
    ,
    
      "Teams":"Livingston",
      "Lon":-3.52207,
      "Lat":55.8864,
      "Weather":"  api.openweathermap.org/data/2.5/weather?lat=55.8864&lon=-3.52207&mode=html"
    ,
    
      "Teams":"Brighton and Hove Albion",
      "Lon":-0.08014,
      "Lat":50.8609,
      "Weather":"  api.openweathermap.org/data/2.5/weather?lat=50.8609&lon=-0.08014&mode=html"
    
]

ajx-json-styles.css

#raw_json 
    border:1px solid #333;
    background-color:#ccc;
    padding: 2em;
    word-wrap: break-word;
    margin-bottom: 2em;
    width: 40%;
    float: left;

#parsed_json 
    padding:2em;
    border: 1px solid blue;
    width: 40%;
    float: right;

h2 
    margin:0;
    padding:0;

.item
    padding-bottom: 0.25em;
    padding-top: 0.25em;
    background-color: #E9BB18;
    border: 1px solid white;


【讨论】:

以上是关于OpenWeather API - 提取 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中使用 OpenWeather API 的时区属性获取任何城市/国家的当前时间?

api.openweather

从 Watson Assistant 调用 OpenWeather API:“直接 CloudFunctions 调用不成功”

JSON 不可转换为 void (Openweathermap API)

从 REST API 中提取 JSON 响应

未从提取的 API 数据中获取正确的 JSON 格式 [关闭]