gpt4 book ai didi

java - 在复杂的 Google 地理编码 JSON 对象中按键获取值 - Java - android

转载 作者:行者123 更新时间:2023-11-29 03:16:36 28 4
gpt4 key购买 nike

我用了这个有用的code snippet为了在我的 android 应用程序中获取当前位置,现在我想获取 route (街道地址),street_number , postal_codecountry (始终 long_name )在 Google 地理编码 JSON 对象中。目前我使用 do - while 循环然后拆分 formatted_address以获得所需的结果,但我认为通过其键访问该值会更好。

JSON 看起来像这样:

{
"results": [
{
"types": [
"street_address"
],
"formatted_address": "RotenturmstraÃe 2, 1010 Vienna, Austria",
"address_components": [
{
"types": [
"street_number"
],
"short_name": "2",
"long_name": "2"
},
{
"types": [
"route"
],
"short_name": "Rotenturmstr.",
"long_name": "RotenturmstraÃe"
},
{
"types": [
"sublocality_level_1",
"sublocality",
"political"
],
"short_name": "Innere Stadt",
"long_name": "Innere Stadt"
},
{
"types": [
"locality",
"political"
],
"short_name": "Vienna",
"long_name": "Vienna"
},
{
"types": [
"administrative_area_level_1",
"political"
],
"short_name": "Vienna",
"long_name": "Vienna"
},
{
"types": [
"country",
"political"
],
"short_name": "AT",
"long_name": "Austria"
},
{
"types": [
"postal_code"
],
"short_name": "1010",
"long_name": "1010"
}
],
"geometry": {
"viewport": {
"southwest": {
"lng": 16.3719497197085,
"lat": 48.20797491970851
},
"northeast": {
"lng": 16.3746476802915,
"lat": 48.2106728802915
}
},
"location": {
"lng": 16.3732987,
"lat": 48.2093239
},
"location_type": "ROOFTOP"
}
},
{
"types": [
"neighborhood",
"political"
],
"formatted_address": "Stephansdom, 1010 Vienna, Austria",
"address_components": [
{
"types": [
"neighborhood",
"political"
],
"short_name": "Stephansdom",
"long_name": "Stephansdom"
},
{
"types": [
"sublocality_level_1",
"sublocality",
"political"
],
"short_name": "Innere Stadt",
"long_name": "Innere Stadt"
},
{
"types": [
"locality",
"political"
],
"short_name": "Vienna",
"long_name": "Vienna"
},
{
"types": [
"administrative_area_level_1",
"political"
],
"short_name": "Vienna",
"long_name": "Vienna"
},
{
"types": [
"country",
"political"
],
"short_name": "AT",
"long_name": "Austria"
},
{
"types": [
"postal_code"
],
"short_name": "1010",
"long_name": "1010"
}
],
"geometry": {
"bounds": {
"southwest": {
"lng": 16.3663459,
"lat": 48.2016949
},
"northeast": {
"lng": 16.382804,
"lat": 48.21546559999999
}
},
"viewport": {
"southwest": {
"lng": 16.3663459,
"lat": 48.2016949
},
"northeast": {
"lng": 16.382804,
"lat": 48.21546559999999
}
},
"location": {
"lng": 16.3767451,
"lat": 48.2083206
},
"location_type": "APPROXIMATE"
}
},
{
"types": [
"postal_code"
],
"formatted_address": "1010 Vienna, Austria",
"address_components": [
{
"types": [
"postal_code"
],
"short_name": "1010",
"long_name": "1010"
},
{
"types": [
"locality",
"political"
],
"short_name": "Vienna",
"long_name": "Vienna"
},
{
"types": [
"administrative_area_level_1",
"political"
],
"short_name": "Vienna",
"long_name": "Vienna"
},
{
"types": [
"country",
"political"
],
"short_name": "AT",
"long_name": "Austria"
}
],
"geometry": {
"bounds": {
"southwest": {
"lng": 16.3552218,
"lat": 48.1992606
},
"northeast": {
"lng": 16.3853131,
"lat": 48.2185876
}
},
"viewport": {
"southwest": {
"lng": 16.3552218,
"lat": 48.1992606
},
"northeast": {
"lng": 16.3853131,
"lat": 48.2185876
}
},
"location": {
"lng": 16.3677601,
"lat": 48.2083556
},
"location_type": "APPROXIMATE"
}
},
{
"types": [
"sublocality_level_1",
"sublocality",
"political"
],
"formatted_address": "Innere Stadt, 1010 Vienna, Austria",
"address_components": [
{
"types": [
"sublocality_level_1",
"sublocality",
"political"
],
"short_name": "Innere Stadt",
"long_name": "Innere Stadt"
},
{
"types": [
"locality",
"political"
],
"short_name": "Vienna",
"long_name": "Vienna"
},
{
"types": [
"administrative_area_level_1",
"political"
],
"short_name": "Vienna",
"long_name": "Vienna"
},
{
"types": [
"country",
"political"
],
"short_name": "AT",
"long_name": "Austria"
},
{
"types": [
"postal_code"
],
"short_name": "1010",
"long_name": "1010"
}
],
"geometry": {
"bounds": {
"southwest": {
"lng": 16.3552218,
"lat": 48.1992606
},
"northeast": {
"lng": 16.3853131,
"lat": 48.2185876
}
},
"viewport": {
"southwest": {
"lng": 16.3552218,
"lat": 48.1992606
},
"northeast": {
"lng": 16.3853131,
"lat": 48.2185876
}
},
"location": {
"lng": 16.3697428,
"lat": 48.2088774
},
"location_type": "APPROXIMATE"
}
},
{
"types": [
"administrative_area_level_1",
"political"
],
"formatted_address": "Vienna, Austria",
"address_components": [
{
"types": [
"administrative_area_level_1",
"political"
],
"short_name": "Vienna",
"long_name": "Vienna"
},
{
"types": [
"country",
"political"
],
"short_name": "AT",
"long_name": "Austria"
}
],
"geometry": {
"bounds": {
"southwest": {
"lng": 16.1826199,
"lat": 48.1182699
},
"northeast": {
"lng": 16.5774999,
"lat": 48.3230999
}
},
"viewport": {
"southwest": {
"lng": 16.1826199,
"lat": 48.1182699
},
"northeast": {
"lng": 16.5774999,
"lat": 48.3230999
}
},
"location": {
"lng": 16.3738138,
"lat": 48.20823499999999
},
"location_type": "APPROXIMATE"
}
}
]

这是我的代码:

public static JSONObject getLocationInfo(double lat, double lng) {

HttpGet httpGet = new HttpGet("http://maps.googleapis.com/maps/api/geocode/json?latlng="+ lat+","+lng +"&sensor=true");
HttpClient client = new DefaultHttpClient();
HttpResponse response;
StringBuilder stringBuilder = new StringBuilder();

try {
response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
InputStream stream = entity.getContent();
int b;
while ((b = stream.read()) != -1) {
stringBuilder.append((char) b);
}
} catch (ClientProtocolException e) {
} catch (IOException e) {
}

JSONObject jsonObject = new JSONObject();
try {
jsonObject = new JSONObject(stringBuilder.toString());
} catch (JSONException e) {
e.printStackTrace();
}

return jsonObject;
}

public static String getCurrentLocationViaJSON(double lat, double lng) {

JSONObject jsonObj = getLocationInfo(lat, lng);
Log.i("JSON string =>", jsonObj.toString());

String currentLocation = "testing";
String street_address = null;
String postal_code = null;

try {
String status = jsonObj.getString("status").toString();
Log.i("status", status);

if(status.equalsIgnoreCase("OK")){
JSONArray results = jsonObj.getJSONArray("results");
int i = 0;
Log.i("i", i+ "," + results.length() ); //TODO delete this
do{

JSONObject r = results.getJSONObject(i);
JSONArray typesArray = r.getJSONArray("types");
String types = typesArray.getString(0);

if(types.equalsIgnoreCase("street_address")){
street_address = r.getString("formatted_address").split(",")[0];
Log.i("street_address", street_address);
}else if(types.equalsIgnoreCase("postal_code")){
postal_code = r.getString("formatted_address");
Log.i("postal_code", postal_code);
}

if(street_address!=null && postal_code!=null){
currentLocation = street_address + "," + postal_code;
Log.i("Current Location =>", currentLocation); //Delete this
i = results.length();
}

i++;
}while(i<results.length());

Log.i("JSON Geo Locatoin =>", currentLocation);
return currentLocation;
}

} catch (JSONException e) {
Log.e("testing","Failed to load JSON");
e.printStackTrace();
}
return null;
}

如有任何帮助,我们将不胜感激。

最佳答案

在该代码示例中,他们使用 JSONObject,因此您将要使用 getJSONObject(i)getJSONArray()getString () 来解析你的数据。

可能建议使用这样的函数将数据解析为更易读的变量。否则,如果您直接使用它们的 key ,您将得到类似 String street_address = jsonObj.getJSONArray("results").getJSONObject(i).getString("formatted_address") 之类的东西,其中很好,但它很大。

此外,您所说的“最好通过其键访问值”是什么意思有点不清楚。在您的循环中,您正在通过其键访问该值。代码 r.getString("formatted_address") 使用键 formatted_address 访问该键值对的数据。

这是一种可能的解决方案:

public JSONObject getCurrentLocationViaJSON(double lat, double lng) {
// Returns a JSONObject with route (street_address), street_number, postal_code and country

JSONObject jsonObj = getLocationInfo(lat, lng);
Log.i("JSON string =>", jsonObj.toString());

String currentLocation = "testing";
String route = null;
String street_number = null;
String postal_code = null;
String country = null;

try {
String status = jsonObj.getString("status").toString();
Log.i("status", status);

if(status.equalsIgnoreCase("OK")){
JSONArray results = jsonObj.getJSONArray("results");
int i = 0;
Log.i("i", i+ "," + results.length() ); //TODO delete this
do{

JSONObject r = results.getJSONObject(0);
JSONArray addressComponentsArray = r.getJSONArray("address_components");
JSONArray addressComponents = addressComponentsArray.getJSONObject(i);
JSONArray typesArray = addressComponents.getJSONArray(0);
String types = typesArray.getString(0);

if(types.equalsIgnoreCase("street_number")){
street_number = addressComponents.getString("short_name");
Log.i("street_number", street_number);
}else if(types.equalsIgnoreCase("postal_code")){
postal_code = addressComponents.getString("long_name");
Log.i("postal_code", postal_code);
}else if(types.equalsIgnoreCase("country")){
country = addressComponents.getString("long_name");
Log.i("country", country);
}else if(types.equalsIgnoreCase("route")){
route = addressComponents.getString("long_name");
Log.i("postal_code", postal_code);
}

i++;
}while(i<results.length());

Log.i("JSON Geo Locatoin =>", currentLocation);
return currentLocation;
}

} catch (JSONException e) {
Log.e("testing","Failed to load JSON");
e.printStackTrace();
}

JSONObject json = new JSONObject();
json.put("street_number", street_number);
json.put("postal_code", postal_code);
json.put("country ", country);
json.put("route", route);

return json;
}

上述方法将解析出路线(街道地址)、街道编号、邮政编码和国家(总是长名称),将其存储在一个 JSONObject 中,然后返回该对象。您可以使用以下内容访问这些值:

JSONObject addressDetails = getCurrentLocationViaJSON(100.1, 100.1);
String streetNum = addressDetails.getString("street_number");

关于java - 在复杂的 Google 地理编码 JSON 对象中按键获取值 - Java - android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26214785/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com