根据特定值过滤嵌套的JSON

时间:2014-06-28 14:55:34

标签: javascript json filtering

我知道有很多关于如何处理JSON的问题,我已经尝试了很多,但我真的被卡住了。

我想要达到的目的如下:
我加载了一个JSON,在那个JSON中,有关于照片的信息。每张照片都有几个属性,其中一个是纬度和经度。这些属性并没有为所有照片指定。我希望最后有一个JSON对象,它只包含带有lat / long值的照片。

JSON看起来像这样:

{
    "current_page": 1,
    "total_pages": 2,
    "total_items": 27,
    "photos": [{
                "id": 63151715,
                "user_id": 430997,
                "name": "Footsteps",
                "description": "Traces in the dunes",
                "camera": "Canon EOS 5D Mark II",
                "lens": null,
                "focal_length": "23",
                "iso": "50",
                "shutter_speed": "30",
                "aperture": "9",
                "times_viewed": 500,
                "rating": 44.2,
                "status": 1,
                "created_at": "2014-03-08T06:02:13-05:00",
                "category": 8,
                "location": null,
                "latitude": 52.399774296136734,
                "longitude": 4.558639526367187

还有一些属性和照片。我已经验证了它,这似乎没问题。

var json = $.getJSON("https://api.500px.com/v1/photos?feature=user&username=bzwemmer&consumer_key=XXX",
    function (json) {
        console.log(json);
    });

var jobj = $.parseJSON(json);

for (var i = 0; i < jobj.length; i++) {
    var type = "point";
    // Path from json from Firebug = json.responseJSON.photos[0].latitude 
    var lat = json.responseJSON.photos[0].latitude;
    console.log(lat);
    if (lat !== null || lat !== "") {
        geoobj.photos.push({
            lat: photos.lat,
            lon: photos.lon,
            name: photos.name,
            image_url: photos.image_url
        });
    }
}

我想选择几个属性并将它们放在另一个JSON中进行进一步处理。但是,对于我尝试的所有内容,我在Firebug中收到lat = undefined的消息。

我希望有人知道我哪里出错了,因为我再也看不到了。

3 个答案:

答案 0 :(得分:3)

您正在尝试访问回调函数之外的结果。不起作用。总是在回调函数内处理结果。尝试下面的代码。

<script type='text/javascript'>

    $.getJSON("https://api.500px.com/v1/photos?feature=user&username=bzwemmer&consumer_key=XXX", function(json) {

        var jobj = $.parseJSON(json);

        $(jobj.photos).each(function(ind, val){
            if(val.latitude != "" && val.longitude != "") {
                geoobj.photos.push({
                lat: val.latitude,
                lon: val.longitude,
                name: val.name,
                image_url: val.image_url});  
            }
        });
    });

</script>

答案 1 :(得分:0)

如果您的json有效,它应该有效,请查看此jsfiddle sample

以下是简化版

var jsonObj={
         "current_page":1,
          "total_pages":2,
          "total_items":27,
          "photos":
               [{"latitude":52.399774296136734,
                 "longitude":4.558639526367187}]
         };

alert(jsonObj.photos[0].latitude);

答案 2 :(得分:0)

您应该接受Rashmin Javiya&#39; answer。 我开始以同样的方式回答,但她打败了我!

以下是代码的固定版本,用于处理分页并编写一些调试输出。

var geoobj = {photos:[]};
var missingLLcounter = 0;
(function getPhotos(page) {
    var request = "https://api.500px.com/v1/photos?feature=user&username=bzwemmer&consumer_key=ByGjMRRao3aAozGsq6HuxZmJfA6ufWzNL32VPplp&page="+page;

    console.log('getting page '+page+': '+request);

    $.getJSON(request, function (json) {
        $(json.photos).each(function(ind, val) {
            if(val.latitude && val.longitude) {
                geoobj.photos.push({
                    lat: val.latitude,
                    lon: val.longitude,
                    name: val.name,
                    image_url: val.image_url
                });
            } else {
                missingLLcounter++;
            }
        });

        console.log('done with page '+page+', '+(json.total_pages-page)+' pages to go.');

        if(json.total_pages>page) {
            getPhotos(++page);
        } else {
            console.log('done! retrieved '+page+' page'+(page>1?'s':'')+' with '+(geoobj.photos.length+missingLLcounter)+' total records ('+missingLLcounter+' were missing lat/lngs).');
        }
    });
})(1);