2013-08-29 2 views
2

Я пытаюсь геокодировать адрес и получить координаты lat/lng в java. Я могу геокодировать адрес и вернуть его в объект json, но я не могу понять, как использовать json-simple для синтаксического анализа json ниже, чтобы получить lat/lng. Любая помощь приветствуется.json-simple Попытка получить определенное значение от JSON

{ 
    "results" : [ 
     { 
     "address_components" : [ 
      { 
       "long_name" : "Minneapolis", 
       "short_name" : "Minneapolis", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Hennepin County", 
       "short_name" : "Hennepin County", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "Minnesota", 
       "short_name" : "MN", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "United States", 
       "short_name" : "US", 
       "types" : [ "country", "political" ] 
      } 
     ], 
     "formatted_address" : "Minneapolis, MN, USA", 
     "geometry" : { 
      "bounds" : { 
       "northeast" : { 
        "lat" : 45.05125, 
        "lng" : -93.193794 
       }, 
       "southwest" : { 
        "lat" : 44.890144, 
        "lng" : -93.32916299999999 
       } 
      }, 
      "location" : { 
       "lat" : 44.983334, 
       "lng" : -93.26666999999999 
      }, 
      "location_type" : "APPROXIMATE", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 45.05125, 
        "lng" : -93.193794 
       }, 
       "southwest" : { 
        "lat" : 44.890144, 
        "lng" : -93.32916299999999 
       } 
      } 
     }, 
     "types" : [ "locality", "political" ] 
     } 
    ], 
    "status" : "OK" 
} 

Я пробовал много разных вещей, но это моя последняя неудача:

JSONObject json = (JSONObject)parser.parse(addressAsString); 
JSONObject results = (JSONObject) json.get("results"); <-- LINE 186 
JSONArray geometry = (JSONArray) results.get("geometry"); 

for(int i = 0; i < geometry.size(); i++) { 
    JSONObject p = (JSONObject) geometry.get(i); 
    System.out.println(p); 
} 

Он производит этот StackTrace:

Exception in thread "main" java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject 
    at com.AddressGeocoder.geocode(AddressGeocoder.java:186) 
    at com.AddressGeocoder.<init>(AddressGeocoder.java:48) 
    at com.Geocoder.main(Geocoder.java:7) 
+0

Я отредактировал мой ответ я бы посмотрел на него. – progrenhard

+0

Взгляните на мой ответ, возможно, это поможет вам. Дайте мне знать, если у вас есть определенное требование. – Prateek

ответ

1

Итак, позвольте мне разбить его для вас, чтобы вы могли понять, в JSON-х {} обозначает объект [] обозначает массив. Просто? Да.

визуальный пробой

results 
    index 0 -> 
      addressed_components(array)--> 
             long_name(single entity) 
             short_name(single entity) 
             types(array) 

      formatted_address(single entity) 
      geometry(huge ass object with nested objects) 
      types(array) 
  • В основном, в коде вы имеете теперь результаты 0 индекс будет содержать "address_components", "formatted_address", "геометрия", "типы". (ПРИМЕЧАНИЕ. ЭТО ВСЕ ОДИН ОБЪЕКТ)

  • "Address_components" - это массив.

  • которые содержат несколько «адресов_компонентов».

  • «Геометрия» - это очень большой объект, в котором есть много разных атрибутов.

  • Искомый тип - это массив.


псевдо-код для извлечения элементов из массивов, йо!

LOOP THROUGH JSON ARRAY 
    ASSIGN OBJECT VALUES // getting different objects that are indexed in the array. 

(если вы хотите увидеть код, чтобы увидеть, как все это делается, дайте мне знать)

Gl человека.

+0

Объяснение объектов и массивов было полезным. Я понял это, как только понял. – Catfish

3

Это потому, что "результаты" является JSONArray , Попытка:

JSONArray results = (JSONArray) json.getJSONArray("results"); 
+0

Если я меняю это, тогда я получаю сообщение об ошибке в следующей строке: '" Метод get (int) в типе ArrayList не применим для аргументов (String) "' – Catfish

+0

Да, это потому, что вы изменили результаты в JSONArray вместо JSONObject. Вам нужно будет пройти JSONArray, чтобы получить JSONObjects. – jaesanx

+0

Откуда вы знаете, что должно быть JSONObect и что должно быть JSONArray? – Catfish

3

«результаты» - это JSONArray, заполненный (в этом примере только один) JSONObjects. Эти JSONObject содержат вашу ожидаемую геометрию JSONArray. Ниже код изменен, так что перебирает результаты и печать данных геометрии:

JSONObject json = (JSONObject)parser.parse(addressAsString); 
JSONArray results = (JSONArray) json.get("results"); 
for (int i = 0; i < results.size(); i++) { 
    // obtaining the i-th result 
    JSONObject result = (JSONObject) results.get(i); 
    JSONObject geometry = (JSONObject) result.get("geometry"); 
    JSONObject location = (JSONObject) geometry.get("location"); 
    System.out.println(location.get("lat")); 
    System.out.println(location.get("lng")); 
} 
+0

Это вызывает исключение 'org.json.simple.JSONObject нельзя передать в org.json.simple.JSONArray' в строке' JSONArray geometry = (JSONArray) result.get ("geometry"); ' – Catfish

+0

Вы правы, Прости. Я отредактировал свой ответ. Рад, что вы уже поняли решение. – Bengt

1

Я использую net.sf.json библиотеку, но вы можете использовать логику

Вот код:

import java.util.Iterator; 

import net.sf.json.JSONArray; 
import net.sf.json.JSONException; 
import net.sf.json.JSONObject; 
import net.sf.json.util.JSONUtils; 

public class Test { 

    static String str = "{ \"results\" : [ { \"address_components\" : [ {  \"long_name\" : \"Minneapolis\",  \"short_name\" : \"Minneapolis\",  \"types\" : [ \"locality\", \"political\" ] }, {  \"long_name\" : \"Hennepin County\",  \"short_name\" : \"Hennepin County\",  \"types\" : [ \"administrative_area_level_2\", \"political\" ] }, {  \"long_name\" : \"Minnesota\",  \"short_name\" : \"MN\",  \"types\" : [ \"administrative_area_level_1\", \"political\" ] }, {  \"long_name\" : \"United States\",  \"short_name\" : \"US\",  \"types\" : [ \"country\", \"political\" ] } ], \"formatted_address\" : \"Minneapolis, MN, USA\", \"geometry\" : { \"bounds\" : {  \"northeast\" : {  \"lat\" : 45.05125,  \"lng\" : -93.193794  },  \"southwest\" : {  \"lat\" : 44.890144,  \"lng\" : -93.32916299999999  } }, \"location\" : {  \"lat\" : 44.983334,  \"lng\" : -93.26666999999999 }, \"location_type\" : \"APPROXIMATE\", \"viewport\" : {  \"northeast\" : {  \"lat\" : 45.05125,  \"lng\" : -93.193794  },  \"southwest\" : {  \"lat\" : 44.890144,  \"lng\" : -93.32916299999999  } } }, \"types\" : [ \"locality\", \"political\" ] } ], \"status\" : \"OK\"}"; 

    public static void main(String[] args) { 
     parseAndCheckJsonObj(str, ""); 
    } 

    static void parseAndCheckJsonObj(Object str, Object key) { 
     /* 
     * Check whether str is Valid JSON 
     * String i.e. started by { [ or not 
     */ 
     if (JSONUtils.mayBeJSON(str.toString())) { 
      try { 

       if (JSONUtils.isArray(str)) { 
        /*if block Check for str as a Json Array*/ 
        JSONArray rootArr = JSONArray.fromObject(str); 
        for (int i = 0; i < rootArr.size(); i++) { 
         parseAndCheckJsonObj(rootArr.get(i), key); 
        } 
       } else { 
        /*else block Check for str as a Json Object*/ 
        JSONObject rootObj = JSONObject.fromObject(str); 

        Iterator keyIter = rootObj.keys(); 
        while (keyIter.hasNext()) { 
         Object objKey = keyIter.next(); 
         parseAndCheckJsonObj(rootObj.get(objKey), objKey); 
        } 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } else { 
      if (key.equals("lat")) 
       System.out.println("Latitude is : " + str); 
      else if (key.equals("lng")) 
       System.out.println("Longitude is : " + str); 
      else 
       System.out.println(key + " : " + str); 
     } 
    } 
} 

Мой Выход:

long_name : Minneapolis 
short_name : Minneapolis 
types : locality 
types : political 
long_name : Hennepin County 
short_name : Hennepin County 
types : administrative_area_level_2 
types : political 
long_name : Minnesota 
short_name : MN 
types : administrative_area_level_1 
types : political 
long_name : United States 
short_name : US 
types : country 
types : political 
formatted_address : Minneapolis, MN, USA 
Latitude is : 45.05125 
Longitude is : -93.193794 
Latitude is : 44.890144 
Longitude is : -93.329163 
Latitude is : 44.983334 
Longitude is : -93.26666999999999 
location_type : APPROXIMATE 
Latitude is : 45.05125 
Longitude is : -93.193794 
Latitude is : 44.890144 
Longitude is : -93.329163 
types : locality 
types : political 
status : OK 
+0

Это хороший ответ, но мне не нужен рекурсивный способ получить все значения. Я просто специально изучаю lat/lng, и все. – Catfish

Смежные вопросы