я работаю с объектом последующей 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;
}
}
Ну я использую библиотеку Джексона для другой десериализации/сериализации и она работает хорошо. Я думал, что было бы хорошо быть последовательным. Также я могу вырезать много кода котельной плиты со следующей строкой Location location = objectMapper.readValue (httpURLConnection.getInputStream(), Location.class); Не должен ли JSONObject проходить через объект? – jiduvah
Очевидно, вы можете настроить то, что я предоставил выше, в библиотеку Джексона, которую вы используете. Я не знаком с этим, поэтому я не могу сказать, как это сделать, но идея та же самая, чтобы получить определенные узлы json для доступа к значениям, а не перебирать весь ответ json. – Lefteris
Как вы знаете если это очевидно, если вы не знаете библиотеку? – jiduvah