2013-12-20 3 views
0

я работаю с объектом последующей JSon, что я извлечь из API Google АдресовПолучите 2 значения от Big Json Object

{ 

    "debug_info":[ 
    ], 
    "html_attributions":[ 
    ], 
    "result":{ 
     "address_components":[ 
      { 
       "long_name":"109", 
       "short_name":"109", 
       "types":[ 
        "street_number" 
       ] 
      }, 
      { 
       "long_name":"Torstraße", 
       "short_name":"Torstraße", 
       "types":[ 
        "route" 
       ] 
      }, 
      { 
       "long_name":"Mitte", 
       "short_name":"Mitte", 
       "types":[ 
        "sublocality", 
        "political" 
       ] 
      }, 
      { 
       "long_name":"Mitte", 
       "short_name":"Mitte", 
       "types":[ 
        "sublocality", 
        "political" 
       ] 
      }, 
      { 
       "long_name":"Berlin", 
       "short_name":"Berlin", 
       "types":[ 
        "locality", 
        "political" 
       ] 
      }, 
      { 
       "long_name":"Berlin", 
       "short_name":"Berlin", 
       "types":[ 
        "administrative_area_level_1", 
        "political" 
       ] 
      }, 
      { 
       "long_name":"Germany", 
       "short_name":"DE", 
       "types":[ 
        "country", 
        "political" 
       ] 
      }, 
      { 
       "long_name":"10119", 
       "short_name":"10119", 
       "types":[ 
        "postal_code" 
       ] 
      } 
     ], 
     "adr_address":"\u003cspanclass=\"street-address\"\u003eTorstraße109\u003c/span\u003e,\u003cspanclass=\"postal-code\"\u003e10119\u003c/span\u003e\u003cspanclass=\"locality\"\u003eBerlin\u003c/span\u003e,\u003cspanclass=\"country-name\"\u003eGermany\u003c/span\u003e", 
     "formatted_address":"Torstraße109,10119Berlin,Germany", 
     "geometry":{ 
      "location":{ 
       "lat":52.5300431, 
       "lng":13.40297 
      } 
     }, 
     "icon":"http://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png", 
     "id":"18c00ced59b4a7fb929dde10a01169517666eec5", 
     "name":"Torstraße109", 
     "reference":"CpQBiQAAAGrYOH9GhUIR5_9XJm8YPZYoudNVoYeIWwD1-zFzjdUp2eKujIt85bUM78FWiY9OgGm2pPoxnCjE5EMhXNz9hiPcLLybacpdSQ10x0mO8UQNs1Mj-EyjGMfBaowMSAxeye_2aDvCyJEk5JAkzTkqXenGi60Dx24o5zKTH1nt1yDBJ3BlKb7Uaas6dBTz2GoqKBIQNFg_NmrCnRGgLxw5VEvtghoU6fl4owiC-5mNZ5RCjS976-S1fyQ", 
     "types":[ 
      "street_address" 
     ], 
     "url":"https://maps.google.com/maps/place?q=Torstra%C3%9Fe+109,+10119+Berlin,+Germany&ftid=0x47a851e486a78201:0xec18bf6093c5c499", 
     "vicinity":"Mitte" 
    }, 
    "status":"OK" 

} 

Единственные свойства, которые я хочу тянуть из него являются широта, LNG и formated_address ,

Каков наиболее эффективный способ сделать это с помощью джексона?

Я знаю, что могу написать собственный десериализатор, но тогда мне пришлось бы называть jsonParser.nextToken слишком много раз.

Что такое лучший способ решить эту проблему?

EDIT

Лучшее, что я могу придумать момент это

public class LocationDeserializer extends JsonDeserializer<Location> { 
    @Override 
    public Location deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { 
     Location location = new Location(); 

     int len = 100; 
     for (int i = 0; i < len; ++i) { 
      String currentName = jsonParser.getCurrentName(); 
      if (currentName != null) { 
       if (jsonParser.getCurrentName().equals("formatted_address")) { 
        location.setDescription(jsonParser.getText()); 
       } else if (jsonParser.getCurrentName().equals("lat")) { 
        location.setLatitude(jsonParser.getDoubleValue()); 
       } else if (jsonParser.getCurrentName().equals("lng")) { 
        location.setLongitude(jsonParser.getDoubleValue()); 
        break; 
       } 
      } 
      jsonParser.nextValue(); 
     } 
     return location; 
    } 
} 

ответ

-1

Почему вы не подбирая ключи от его ценности?

JSONObject json = new JSONObject(response); 

Где ответ - ответ, полученный от Google.

Тогда, чтобы получить свои значения:

JSONObject address = json.getJSONObject("result"); 
String formattedAddress = address.getString("formatted_address"); 


JSONObject locationData = address.getJSONObject("geometry").getJSONObject("location"); 
Location location = new Location(); 
location.setLatitude(locationData.getDouble("lat")); 
location.setLongitude(locationData.getDouble("lng")); 

Вам нужно импортировать

import org.json.JSONObject; 
+0

Ну я использую библиотеку Джексона для другой десериализации/сериализации и она работает хорошо. Я думал, что было бы хорошо быть последовательным. Также я могу вырезать много кода котельной плиты со следующей строкой Location location = objectMapper.readValue (httpURLConnection.getInputStream(), Location.class); Не должен ли JSONObject проходить через объект? – jiduvah

+0

Очевидно, вы можете настроить то, что я предоставил выше, в библиотеку Джексона, которую вы используете. Я не знаком с этим, поэтому я не могу сказать, как это сделать, но идея та же самая, чтобы получить определенные узлы json для доступа к значениям, а не перебирать весь ответ json. – Lefteris

+0

Как вы знаете если это очевидно, если вы не знаете библиотеку? – jiduvah

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