【问题标题】:How do I get geo coordinates out of the JSON? Twitter API如何从 JSON 中获取地理坐标?推特 API
【发布时间】:2012-05-10 16:30:47
【问题描述】:

这是 JSON 输出的内容

{
  "created_at": "Wed, 09 May 2012 22:13:32 +0000",
  "from_user": "EastCClothing",
  "from_user_id": 119699125,
  "from_user_id_str": "119699125",
  "from_user_name": "Tester23",
  "geo": {
    "coordinates": [
      54.9742,
      -1.5974
    ],
    "type": "Point"
  },
  "id": 200347799861198850,
  "id_str": "200347799861198849",
  "iso_language_code": "pt",
  "metadata": {
    "result_type": "recent"
  },
  "profile_image_url": "http://a0.twimg.com/sticky/default_profile_images/default_profile_0_normal.png",
  "profile_image_url_https": "https://si0.twimg.com/sticky/default_profile_images/default_profile_0_normal.png",
  "source": "<a href="http://twitter.com/download/android" rel="nofollow">Twitter for Android</a>",
  "text": "#CM0655 GEO",
  "to_user": null,
  "to_user_id": 0,
  "to_user_id_str": "0",
  "to_user_name": null
}, 

我想要做的是获取坐标,以便我可以将它们与谷歌地图 api 一起使用,我可以访问所有其他详细信息,但无法通过我预期的“json”访问坐标.results[i].geo.coordinates'。这是我的 JQuery

$(function(){
    function searchTweets() {
        var url='http://search.twitter.com/search.json?callback=?&q=cm0655';
        $.getJSON(url,function(json){


            var output = [];


            for (var i = 0, len = json.results.length; i < len; i++) {


               output.push('<p id="tweet"><img id="tweetImage" src="' + json.results[i].profile_image_url + '" width="48" height="48" /><span id="tweetText">' + '<a href="http://twitter.com/' + json.results[i].from_user + '">' + json.results[i].from_user + "</a> " + json.results[i].text + "<br />" + json.results[i].created_at + '</p>' + json.results[i].geo.coordinates + '</span>');
            }

            $("div.twitter2").html(output.join('')).slideDown('slow');
        });
    }


    var timer = setInterval(searchTweets, 20000);


    searchTweets();

});

非常感谢

【问题讨论】:

  • 您可以发布您遇到的错误吗?
  • 没有错误,当我尝试 'json.results[i].geo.coordinates' 时不会显示任何内容,而当我尝试 'json.results[i].geo' 时它会显示 [object Object]
  • 我编辑了我的答案以可能帮助您调试?

标签: jquery json multidimensional-array twitter


【解决方案1】:

我想我会添加 $.each 方法,以防万一有人走上这条路。

    // The code below uses the Twitter API found here https://dev.twitter.com/docs to search for the latest mention of CM0655 (module code).

    var twitterURL = "http://search.twitter.com/search.json?q=%23CM0655";
    function twitterSearch() { // Create the weather function   
        $.ajax({
        url: twitterURL, //http request string for the weather service
        dataType: "jsonp",                                                                                                  
        success: function(JSON) {                      // If successful parse the JSON data
            $('#twitterSearch').html("");
            $.each(JSON.results, function(i,tweet){
                    var tweeterID  = tweet.from_user_id;
                    var dateFormat = tweet.created_at;
                    var newDate    = dateFormat.replace('+0000', '');
                    var title      = 'title="Tweeted from"';
                    var id         = tweet.id;
                    var locData    = tweet.geo;
                    getCordsData(locData);
                    $('#twitterSearch').append('<li id="tweet' + id + '" class="mainP tweet"><img class="tweetImage" src="'+ tweet.profile_image_url +'" height="20" width="20" /> <a class="tweetLink" href="http://twitter.com/' + tweet.from_user + '" target="_blank">' + tweet.from_user + '</a> on the ' + newDate + ' <br /> tweeted<span id="tweetTextColor">: ' + tweet.text + '</span></li>');
            });
        //alert("Ajax text");
        setTimeout(twitterSearch, 10000);
        }
        }); // End of ajax
     } // End of function

    function getCordsData(data){
        if(data == null){
            data = "No location data found!";
            alert(data);
        }else{
            var long = data['coordinates'][0];
            var lat = data['coordinates'][1];
            alert("long:" + long + "Lat:" + lat);
        }
    }

【讨论】:

    【解决方案2】:

    抱歉之前的失败,我找到了一个解决方案,您需要做的是检查 results.geo 是否是一个对象,然后循环如果不排除它或将其设置为我已经完成的其他内容

    免责声明 这不是最好的解决方案,但它可以让您了解如何解决问题。希望对您有所帮助!

    $(function() {
        function searchTweets() {
            var url = 'http://search.twitter.com/search.json?callback=?&q=from:Eastcclothing';
            $.getJSON(url, function(json) {
    
                console.log(json);
                var output = [];
    
    
                for (var i = 0, len = json.results.length; i < len; i++) {
    
                    if ($.isPlainObject(json.results[i].geo)) {
                        output.push('<p id="tweet"><img id="tweetImage" src="' + json.results[i].profile_image_url + '" width="48" height="48" /><span id="tweetText">' + '<a href="http://twitter.com/' + json.results[i].from_user + '">' + json.results[i].from_user + "</a> " + json.results[i].text + "<br />" + json.results[i].created_at + '</p>' + json.results[i].geo.coordinates + '</span>');
                    } else {
                        output.push('<p id="tweet"><img id="tweetImage" src="' + json.results[i].profile_image_url + '" width="48" height="48" /><span id="tweetText">' + '<a href="http://twitter.com/' + json.results[i].from_user + '">' + json.results[i].from_user + "</a> " + json.results[i].text + "<br />" + json.results[i].created_at + '</p>' + json.results[i].geo + '</span>');
                    }
                }
    
                $("div.twitter2").html(output.join('')).slideDown('slow');
            });
        }
    
    
        var timer = setInterval(searchTweets, 20000);
    
    
        searchTweets();
    
    });​
    

    也可以帮助继承一个有效的 jsfiddle http://jsfiddle.net/th3fallen/jc2Kf/

    【讨论】:

    • 也许您可以进一步帮助我,然后我将如何将坐标放入一个变量中以在其他地方使用?
    • 您希望每个位置都在其自己的变量中还是只有一个?
    • 好吧,我需要为每条推文设置一个位置,以便将它们放置在地图上?谢谢你
    • 你可以试试这个jsfiddle.net/th3fallen/jc2Kf/2,它将创建一个名为 location 的对象,其中包含一个包含所有 id 的数组,其中的坐标在底部有一个 console.log 你可能想要删除我刚刚添加了它用于调试。
    【解决方案3】:

    我认为您遇到了问题,因为您试图将数组与字符串连接起来,您可能需要做的是:

    ...+"["+json.results[i].geo.coordinates[0]+","+json.results[i].geo.coordinates[1]+"]"+...
    

    而不仅仅是

    ...+json.results[i].geo.coordinates+...
    

    或者试试这个:

    if (json.results[i].geo) console.log('<p id="tweet"><img id="tweetImage" src="' + json.results[i].profile_image_url + '" width="48" height="48" /><span id="tweetText">' + '<a href="http://twitter.com/' + json.results[i].from_user + '">' + json.results[i].from_user + "</a> " + json.results[i].text + "<br />" + json.results[i].created_at + '</p>' + "["+json.results[i].geo.coordinates[0]+","+json.results[i].geo.coordinates[1]+"]" + '</span>');
    

    甚至:

    if (json.results[i].geo) console.log($('<p id="tweet"><img id="tweetImage" src="' + json.results[i].profile_image_url + '" width="48" height="48" /><span id="tweetText">' + '<a href="http://twitter.com/' + json.results[i].from_user + '">' + json.results[i].from_user + "</a> " + json.results[i].text + "<br />" + json.results[i].created_at + '</p>' + "["+json.results[i].geo.coordinates[0]+","+json.results[i].geo.coordinates[1]+"]" + '</span>'));
    

    并确保 html 看起来正确。

    我注意到的另一个问题是您在&lt;/p&gt; 标记之前关闭了&lt;/span&gt; 标记,这是无效的html。我不认为这是你的问题(可能是?),但你应该解决它。

    【讨论】:

    • 不确定console.log 应该做什么,但它会删除所有输出,仍然从两个sn-ps 中的任何一个都得不到任何信息。我很感谢你的帮助,还有更多的想法吗?我重新排列了 HTML,但正如预期的那样,这对功能没有任何作用
    • console.log 将打印出浏览器控制台中的文本。在您的浏览器中,如果您单击查看 -> 开发人员 -> JavaScript 控制台,然后再次运行您的代码,它应该会在控制台中打印出文本。
    • 返回的唯一内容是 [19:03:04.392] json.results[i].geo 的列表为 null @localhost/halesports2/content/test.html:43 但所有推文 geo.coordinates 都为 'null ' 我想得到那些不是的坐标
    • 我再次编辑了我的答案,取以if (json... 开头的两行并将它们都放在您的output.push(... 行的正上方,检查控制台,并验证打印出的文本,以及正在创建的 html 对象是您所期望的。
    • 我已经按照您的建议进行了编辑,控制台中没有任何输出。请指教?
    猜你喜欢
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 2020-01-16
    相关资源
    最近更新 更多