无法从 Twitter 地理编码中检索地点坐标



我遇到了一个问题,我的逻辑无法从 Twitter 提要中检索 JSON 数组中的前两个坐标。我正在使用Jackson JsonNode来检索Twitter提要。

以下是我首先验证节点是否为空的逻辑,如果它不为空,那么我尝试从平面上检索前两个 lon/lat 坐标。

问题是它永远无法检索转推的坐标 -> 地点 -> Bounding_box -> 坐标 -> 得到 0 0 和得到 0 1

源代码逻辑

                if(root.path("retweeted_status").path("place").path("bounding_box").get("coordinates") != null){
                    lon = root.path("retweeted_status").path("place").path("bounding_box").path("coordinates").get(0).get(0).textValue();
                    lat = root.path("retweeted_status").path("place").path("bounding_box").path("coordinates").get(0).get(1).textValue();
                    if(root.path("retweeted_status").path("place").get("full_name") != null) {
                        userlocation = root.path("retweeted_status").path("place").get("full_name").textValue();
                    }
                }

我正在尝试检索的部分,bounding_box数组中的前两个地理代码

        "place": {
        "id": "5a110d312052166f",
        "url": "https://api.twitter.com/1.1/geo/id/5a110d312052166f.json",
        "place_type": "city",
        "name": "San Francisco",
        "full_name": "San Francisco, CA",
        "country_code": "US",
        "country": "United States",
        "bounding_box": {
            "type": "Polygon",
            "coordinates": [
                [
                    [-122.514926, 37.708075],
                    [-122.514926, 37.833238],
                    [-122.357031, 37.833238],
                    [-122.357031, 37.708075]
                ]
            ]
        },
        "attributes": {}
    },

示例 JSON

 {  
   "created_at":"Fri Feb 05 01:36:27 +0000 2016",
   "id":695420692209111000,
   "id_str":"695420692209111040",
   "text":"RT @Sayhop: When your boyfriend doesn't watch your show  #RealFansGetIt X1 @XFINITY #ad https://t.co/E4H3zO92nV",
   "source":"<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for iPhone</a>",
   "truncated":false,
   "in_reply_to_status_id":null,
   "in_reply_to_status_id_str":null,
   "in_reply_to_user_id":null,
   "in_reply_to_user_id_str":null,
   "in_reply_to_screen_name":null,
   "user":{  
      "id":278162142,
      "id_str":"278162142",
      "name":"Alexeia  ♡",
      "screen_name":"_vievelv_",
      "location":null,
      "url":null,
      "description":"Itty Bitty ❤️",
      "protected":false,
      "verified":false,
      "followers_count":1571,
      "friends_count":1246,
      "listed_count":0,
      "favourites_count":344,
      "statuses_count":21194,
      "created_at":"Wed Apr 06 18:46:36 +0000 2011",
      "utc_offset":-18000,
      "time_zone":"Eastern Time (US & Canada)",
      "geo_enabled":true,
      "lang":"en",
      "contributors_enabled":false,
      "is_translator":false,
      "profile_background_color":"642D8B",
      "profile_background_image_url":"http://pbs.twimg.com/profile_background_images/656263432/w1zrzuisccmzjk0qhv5h.jpeg",
      "profile_background_image_url_https":"https://pbs.twimg.com/profile_background_images/656263432/w1zrzuisccmzjk0qhv5h.jpeg",
      "profile_background_tile":true,
      "profile_link_color":"FF00EE",
      "profile_sidebar_border_color":"65B0DA",
      "profile_sidebar_fill_color":"7AC3EE",
      "profile_text_color":"3D1957",
      "profile_use_background_image":true,
      "profile_image_url":"http://pbs.twimg.com/profile_images/652259214774128640/O8LDMd8c_normal.jpg",
      "profile_image_url_https":"https://pbs.twimg.com/profile_images/652259214774128640/O8LDMd8c_normal.jpg",
      "profile_banner_url":"https://pbs.twimg.com/profile_banners/278162142/1441077378",
      "default_profile":false,
      "default_profile_image":false,
      "following":null,
      "follow_request_sent":null,
      "notifications":null
   },
   "geo":null,
   "coordinates":null,
   "place":null,
   "contributors":null,
   "retweeted_status":{  
      "created_at":"Fri Jan 22 20:19:36 +0000 2016",
      "id":690629910960799700,
      "id_str":"690629910960799744",
      "text":"When your boyfriend doesn't watch your show  #RealFansGetIt X1 @XFINITY #ad https://t.co/E4H3zO92nV",
      "source":"<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for iPhone</a>",
      "truncated":false,
      "in_reply_to_status_id":null,
      "in_reply_to_status_id_str":null,
      "in_reply_to_user_id":null,
      "in_reply_to_user_id_str":null,
      "in_reply_to_screen_name":null,
      "user":{  
         "id":25011208,
         "id_str":"25011208",
         "name":"Sara Hopkins",
         "screen_name":"Sayhop",
         "location":"Atlanta, GA",
         "url":"http://shortyawards.com/8th/sayhop",
         "description":"never bored || TV host/social media creator ⭐️⭐️⭐️⭐️⭐️ IG/snapchat: sayhop",
         "protected":false,
         "verified":true,
         "followers_count":50761,
         "friends_count":998,
         "listed_count":98,
         "favourites_count":13178,
         "statuses_count":4231,
         "created_at":"Wed Mar 18 02:31:51 +0000 2009",
         "utc_offset":-18000,
         "time_zone":"Eastern Time (US & Canada)",
         "geo_enabled":true,
         "lang":"en",
         "contributors_enabled":false,
         "is_translator":false,
         "profile_background_color":"000000",
         "profile_background_image_url":"http://pbs.twimg.com/profile_background_images/260784476/Twitter1.jpg",
         "profile_background_image_url_https":"https://pbs.twimg.com/profile_background_images/260784476/Twitter1.jpg",
         "profile_background_tile":false,
         "profile_link_color":"51D4C2",
         "profile_sidebar_border_color":"DBCFAD",
         "profile_sidebar_fill_color":"0F0E0B",
         "profile_text_color":"AD4C9E",
         "profile_use_background_image":true,
         "profile_image_url":"http://pbs.twimg.com/profile_images/688163946512007168/CRqMjOgp_normal.jpg",
         "profile_image_url_https":"https://pbs.twimg.com/profile_images/688163946512007168/CRqMjOgp_normal.jpg",
         "profile_banner_url":"https://pbs.twimg.com/profile_banners/25011208/1414548876",
         "default_profile":false,
         "default_profile_image":false,
         "following":null,
         "follow_request_sent":null,
         "notifications":null
      },
      "geo":null,
      "coordinates":null,
      "place":{  
         "id":"5a110d312052166f",
         "url":"https://api.twitter.com/1.1/geo/id/5a110d312052166f.json",
         "place_type":"city",
         "name":"San Francisco",
         "full_name":"San Francisco, CA",
         "country_code":"US",
         "country":"United States",
         "bounding_box":{  
            "type":"Polygon",
            "coordinates":[  
               [  
                  [  
                     -122.514926,
                     37.708075
                  ],
                  [  
                     -122.514926,
                     37.833238
                  ],
                  [  
                     -122.357031,
                     37.833238
                  ],
                  [  
                     -122.357031,
                     37.708075
                  ]
               ]
            ]
         },
         "attributes":{  
         }
      },
      "contributors":null,
      "is_quote_status":false,
      "retweet_count":4276,
      "favorite_count":14129,
      "entities":{  
         "hashtags":[  
            {  
               "text":"RealFansGetIt",
               "indices":[  
                  45,
                  59
               ]
            },
            {  
               "text":"ad",
               "indices":[  
                  72,
                  75
               ]
            }
         ],
         "urls":[  
         ],
         "user_mentions":[  
            {  
               "screen_name":"XFINITY",
               "name":"XFINITY",
               "id":14996251,
               "id_str":"14996251",
               "indices":[  
                  63,
                  71
               ]
            }
         ],
         "symbols":[  
         ],
         "media":[  
            {  
               "id":690629837333999600,
               "id_str":"690629837333999617",
               "indices":[  
                  76,
                  99
               ],
               "media_url":"http://pbs.twimg.com/ext_tw_video_thumb/690629837333999617/pu/img/ofj5PsOGsynefono.jpg",
               "media_url_https":"https://pbs.twimg.com/ext_tw_video_thumb/690629837333999617/pu/img/ofj5PsOGsynefono.jpg",
               "url":"https://t.co/E4H3zO92nV",
               "display_url":"pic.twitter.com/E4H3zO92nV",
               "expanded_url":"http://twitter.com/Sayhop/status/690629910960799744/video/1",
               "type":"photo",
               "sizes":{  
                  "thumb":{  
                     "w":150,
                     "h":150,
                     "resize":"crop"
                  },
                  "medium":{  
                     "w":600,
                     "h":338,
                     "resize":"fit"
                  },
                  "small":{  
                     "w":340,
                     "h":191,
                     "resize":"fit"
                  },
                  "large":{  
                     "w":1024,
                     "h":576,
                     "resize":"fit"
                  }
               }
            }
         ]
      },
      "extended_entities":{  
         "media":[  
            {  
               "id":690629837333999600,
               "id_str":"690629837333999617",
               "indices":[  
                  76,
                  99
               ],
               "media_url":"http://pbs.twimg.com/ext_tw_video_thumb/690629837333999617/pu/img/ofj5PsOGsynefono.jpg",
               "media_url_https":"https://pbs.twimg.com/ext_tw_video_thumb/690629837333999617/pu/img/ofj5PsOGsynefono.jpg",
               "url":"https://t.co/E4H3zO92nV",
               "display_url":"pic.twitter.com/E4H3zO92nV",
               "expanded_url":"http://twitter.com/Sayhop/status/690629910960799744/video/1",
               "type":"video",
               "sizes":{  
                  "thumb":{  
                     "w":150,
                     "h":150,
                     "resize":"crop"
                  },
                  "medium":{  
                     "w":600,
                     "h":338,
                     "resize":"fit"
                  },
                  "small":{  
                     "w":340,
                     "h":191,
                     "resize":"fit"
                  },
                  "large":{  
                     "w":1024,
                     "h":576,
                     "resize":"fit"
                  }
               },
               "video_info":{  
                  "aspect_ratio":[  
                     16,
                     9
                  ],
                  "duration_millis":11233,
                  "variants":[  
                     {  
                        "bitrate":2176000,
                        "content_type":"video/mp4",
                        "url":"https://video.twimg.com/ext_tw_video/690629837333999617/pu/vid/1280x720/OY7P8akLAqM_C2J1.mp4"
                     },
                     {  
                        "bitrate":320000,
                        "content_type":"video/mp4",
                        "url":"https://video.twimg.com/ext_tw_video/690629837333999617/pu/vid/320x180/HlqkHHrC7SK6cgR8.mp4"
                     },
                     {  
                        "bitrate":832000,
                        "content_type":"video/webm",
                        "url":"https://video.twimg.com/ext_tw_video/690629837333999617/pu/vid/640x360/FfLYyLagrUn8VGgy.webm"
                     },
                     {  
                        "bitrate":832000,
                        "content_type":"video/mp4",
                        "url":"https://video.twimg.com/ext_tw_video/690629837333999617/pu/vid/640x360/FfLYyLagrUn8VGgy.mp4"
                     },
                     {  
                        "content_type":"application/x-mpegURL",
                        "url":"https://video.twimg.com/ext_tw_video/690629837333999617/pu/pl/cXSu_jFCOj5Wcte5.m3u8"
                     },
                     {  
                        "content_type":"application/dash+xml",
                        "url":"https://video.twimg.com/ext_tw_video/690629837333999617/pu/pl/cXSu_jFCOj5Wcte5.mpd"
                     }
                  ]
               }
            }
         ]
      },
      "favorited":false,
      "retweeted":false,
      "possibly_sensitive":false,
      "filter_level":"low",
      "lang":"en"
   },
   "is_quote_status":false,
   "retweet_count":0,
   "favorite_count":0,
   "entities":{  
      "hashtags":[  
         {  
            "text":"RealFansGetIt",
            "indices":[  
               57,
               71
            ]
         },
         {  
            "text":"ad",
            "indices":[  
               84,
               87
            ]
         }
      ],
      "urls":[  
      ],
      "user_mentions":[  
         {  
            "screen_name":"Sayhop",
            "name":"Sara Hopkins",
            "id":25011208,
            "id_str":"25011208",
            "indices":[  
               3,
               10
            ]
         },
         {  
            "screen_name":"XFINITY",
            "name":"XFINITY",
            "id":14996251,
            "id_str":"14996251",
            "indices":[  
               75,
               83
            ]
         }
      ],
      "symbols":[  
      ],
      "media":[  
         {  
            "id":690629837333999600,
            "id_str":"690629837333999617",
            "indices":[  
               88,
               111
            ],
            "media_url":"http://pbs.twimg.com/ext_tw_video_thumb/690629837333999617/pu/img/ofj5PsOGsynefono.jpg",
            "media_url_https":"https://pbs.twimg.com/ext_tw_video_thumb/690629837333999617/pu/img/ofj5PsOGsynefono.jpg",
            "url":"https://t.co/E4H3zO92nV",
            "display_url":"pic.twitter.com/E4H3zO92nV",
            "expanded_url":"http://twitter.com/Sayhop/status/690629910960799744/video/1",
            "type":"photo",
            "sizes":{  
               "thumb":{  
                  "w":150,
                  "h":150,
                  "resize":"crop"
               },
               "medium":{  
                  "w":600,
                  "h":338,
                  "resize":"fit"
               },
               "small":{  
                  "w":340,
                  "h":191,
                  "resize":"fit"
               },
               "large":{  
                  "w":1024,
                  "h":576,
                  "resize":"fit"
               }
            },
            "source_status_id":690629910960799700,
            "source_status_id_str":"690629910960799744",
            "source_user_id":25011208,
            "source_user_id_str":"25011208"
         }
      ]
   },
   "extended_entities":{  
      "media":[  
         {  
            "id":690629837333999600,
            "id_str":"690629837333999617",
            "indices":[  
               88,
               111
            ],
            "media_url":"http://pbs.twimg.com/ext_tw_video_thumb/690629837333999617/pu/img/ofj5PsOGsynefono.jpg",
            "media_url_https":"https://pbs.twimg.com/ext_tw_video_thumb/690629837333999617/pu/img/ofj5PsOGsynefono.jpg",
            "url":"https://t.co/E4H3zO92nV",
            "display_url":"pic.twitter.com/E4H3zO92nV",
            "expanded_url":"http://twitter.com/Sayhop/status/690629910960799744/video/1",
            "type":"video",
            "sizes":{  
               "thumb":{  
                  "w":150,
                  "h":150,
                  "resize":"crop"
               },
               "medium":{  
                  "w":600,
                  "h":338,
                  "resize":"fit"
               },
               "small":{  
                  "w":340,
                  "h":191,
                  "resize":"fit"
               },
               "large":{  
                  "w":1024,
                  "h":576,
                  "resize":"fit"
               }
            },
            "source_status_id":690629910960799700,
            "source_status_id_str":"690629910960799744",
            "source_user_id":25011208,
            "source_user_id_str":"25011208",
            "video_info":{  
               "aspect_ratio":[  
                  16,
                  9
               ],
               "duration_millis":11233,
               "variants":[  
                  {  
                     "bitrate":2176000,
                     "content_type":"video/mp4",
                     "url":"https://video.twimg.com/ext_tw_video/690629837333999617/pu/vid/1280x720/OY7P8akLAqM_C2J1.mp4"
                  },
                  {  
                     "bitrate":320000,
                     "content_type":"video/mp4",
                     "url":"https://video.twimg.com/ext_tw_video/690629837333999617/pu/vid/320x180/HlqkHHrC7SK6cgR8.mp4"
                  },
                  {  
                     "bitrate":832000,
                     "content_type":"video/webm",
                     "url":"https://video.twimg.com/ext_tw_video/690629837333999617/pu/vid/640x360/FfLYyLagrUn8VGgy.webm"
                  },
                  {  
                     "bitrate":832000,
                     "content_type":"video/mp4",
                     "url":"https://video.twimg.com/ext_tw_video/690629837333999617/pu/vid/640x360/FfLYyLagrUn8VGgy.mp4"
                  },
                  {  
                     "content_type":"application/x-mpegURL",
                     "url":"https://video.twimg.com/ext_tw_video/690629837333999617/pu/pl/cXSu_jFCOj5Wcte5.m3u8"
                  },
                  {  
                     "content_type":"application/dash+xml",
                     "url":"https://video.twimg.com/ext_tw_video/690629837333999617/pu/pl/cXSu_jFCOj5Wcte5.mpd"
                  }
               ]
            }
         }
      ]
   },
   "favorited":false,
   "retweeted":false,
   "possibly_sensitive":false,
   "filter_level":"low",
   "lang":"en",
   "timestamp_ms":"1454636187971"
}

您需要调整访问元素的方式。我已经使用了您提供的JSON,将其存储在文件中,并使用jar进行jackson-core@2.7.0jackson-annotation@2.7.0,从这里maven repo jackson-databind@2.7.0将它们导入到我的项目中,build path在eclipse中作为external jars

我调整了对以下full_name的访问:

//Get the full name 
String fullName = root.path("retweeted_status").path("place").path("full_name").asText(); 

并关注coordinates

//Get the coordinate array
JsonNode coordinates = root.path("retweeted_status").path("place").path("bounding_box").path("coordinates").get(0);

然后访问整个坐标,如下所示:

//print the whole array of array 
System.out.println(coordinates.toString());
//output: [[-122.514926,37.708075],[-122.514926,37.833238],[-122.357031,37.833238],[-122.357031,37.708075]]

要单独访问坐标,请执行以下操作:

//print individual arrays, where each is lat and long 
System.out.println(coordinates.get(0));
//output: [-122.514926,37.708075]
System.out.println(coordinates.get(1));
//output: [-122.514926,37.833238]
System.out.println(coordinates.get(2));
//output: [-122.357031,37.833238]
System.out.println(coordinates.get(3));
//output: [-122.357031,37.708075]

要分别访问每个坐标latlong,请执行以下操作:

//print lat and long of each array seperately
System.out.println(coordinates.get(0).get(0));
//output: -122.514926
System.out.println(coordinates.get(0).get(1));
//output: 37.708075 
System.out.println(coordinates.get(1).get(0));
System.out.println(coordinates.get(1).get(1));
System.out.println(coordinates.get(2).get(0));
System.out.println(coordinates.get(2).get(1));
System.out.println(coordinates.get(3).get(0));
System.out.println(coordinates.get(3).get(1));

以下是整个代码,我用于测试目的,从文件中读取您的 JSON:

import java.io.File;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonTest {
    public static void main(String[] args) throws JsonParseException, IOException {
        File file = new File("C:\test_java\jackson.json"); 
        ObjectMapper mapper = new ObjectMapper();
        JsonNode root = mapper.readTree(file);
        //Get the full name 
        String fullName = root.path("retweeted_status").path("place").path("full_name").asText(); 
        System.out.println("full_name: " + fullName);
        //Get the coordinate array
        JsonNode coordinates = root.path("retweeted_status").path("place").path("bounding_box").path("coordinates").get(0);
        //print the whole array of array 
        System.out.println(coordinates.toString());
        //print individual arrays, where each is lat and long 
        System.out.println(coordinates.get(0));
        System.out.println(coordinates.get(1));
        System.out.println(coordinates.get(2));
        System.out.println(coordinates.get(3));
        //print lat and long of each array seperately
        System.out.println(coordinates.get(0).get(0));
        System.out.println(coordinates.get(0).get(1));
        System.out.println(coordinates.get(1).get(0));
        System.out.println(coordinates.get(1).get(1));
        System.out.println(coordinates.get(2).get(0));
        System.out.println(coordinates.get(2).get(1));
        System.out.println(coordinates.get(3).get(0));
        System.out.println(coordinates.get(3).get(1));
    }
}

这是运行时上述代码的输出:

full_name:加利福尼亚州旧金山

[[-122.514926,37.708075],[-122.514926,37.833238],[-122.357031,37.833238],

[-122.357031,37.708075]] [-122.514926,37.708075] [-122.514926,37.833238]

[-122.357031,37.833238] [-122.357031,37.708075]

-122.514926

37.708075

-122.514926

37.833238

-122.357031

37.833238

-122.357031

37.708075

我怀疑您的代码只需要处理边界框的额外数组

见 https://dev.twitter.com/overview/api/places

坐标:浮点数组

边界框数组包装在一个附加数组中,以便与多边形表示法兼容。

最新更新