Hablando del tiempo… (OpenWeatherMap) 2/2
Para complementar la entrada anterior (Hablando del tiempo… (OpenWeatherMap) 1/2) y «acabarla» me queda publicar el desarrollo móvil correspondiente a la aplicación que vimos anteriormente.
Como ya os comenté en la entrada anterior, el código a utilizar es prácticamente el mismo que hemos utilizado en las aplicaciones para windows (VCL). La mayor diferencia que me he encontrado en el tratamiento de la respuesta JSON que obtenemos del servidor.
Para versiones antiguas de Delphi, podéis utilizar si lo necesitáis la misma librería que ya he recomendado aquí otras veces. Se trata de lkJSON que podéis encontrar en Sourceforge.
En las nuevas versiones de Delphi ya está disponible la unit System.JSON, con lo necesario para no utilizar librerías externas.
function TForm1.ParseTiempoCiudadesHist(AObjResp: TlkJSONobject; var ATiempoProxHoras: TTiempoProxHoras): Boolean; var i, j, num, index:integer; oHorasList, OWList:TlkJSONlist; oHora, oCoord, oMain, oWind, oWeather:TlkJSONobject; Str:String; begin // ini Result := False; // Si no está asignado salimos.. if not Assigned(AobjResp) then begin Exit; end; // Si hay error no parseamos if IsErrorResponse(AObjResp, errCode, ErrMsg) then begin Exit; end; // proteccion para el parseo try // cod. devuelto (datos principales ATiempoProxHoras.Cod := errCode; num := AObjResp.IndexOfName('count'); if (num <> -1) then begin num := GetAsInteger(AObjResp.Field['count'].Value); end; // si no hay ciudades if (num = 0) then begin MessageDlg('No hay ninguna ciudad que coincida con ese código [nombre,pais].', mtWarning, [mbOK], 0); Exit; end; // Lista de horas (Lista) TlkJSONBase(oHorasList) := AObjResp.Field['list']; // array de elementos SetLength(ATiempoProxHoras.TiempoHora, oHorasList.Count); // Quedarse con el primier elemento de la lista... for i := 0 to (oHorasList.Count - 1) do begin // datos de la primera ciudad TlkJSONBase(oHora) := oHorasList.Child[i]; // datos básicos ATiempoProxHoras.TiempoHora[i].dt_text := GetAsString(oHora.Field['dt_txt'].Value); // convertir fecha-Hora Str := ATiempoProxHoras.TiempoHora[i].dt_text; ATiempoProxHoras.TiempoHora[i].dt := EncodeDateTime( StrToIntdef(Copy(Str, 1, 4), 0), StrToIntdef(Copy(Str, 6, 2), 0), StrToIntdef(Copy(Str, 9, 2), 0), StrToIntdef(Copy(Str, 12, 2), 0), StrToIntdef(Copy(Str, 15, 2), 0), StrToIntdef(Copy(Str, 18, 2), 0), 0); // Load Main TlkJSONBase(oMain) := oHora.Field['main']; ATiempoProxHoras.TiempoHora[i].Main.temp := GetAsFloat(oMain.Field['temp'].Value); ATiempoProxHoras.TiempoHora[i].Main.tempmin := GetAsFloat(oMain.Field['temp_min'].Value); ATiempoProxHoras.TiempoHora[i].Main.tempmax := GetAsFloat(oMain.Field['temp_max'].Value); ATiempoProxHoras.TiempoHora[i].Main.pressure := GetAsFloat(oMain.Field['pressure'].Value); ATiempoProxHoras.TiempoHora[i].Main.humidity := GetAsInteger(oMain.Field['humidity'].Value); // Load weather TlkJSONBase(OWList) := oHora.Field['weather']; TlkJSONBase(oWeather) := oWList.Child[0]; ATiempoProxHoras.TiempoHora[i].Weather.id := GetAsInteger(oWeather.Field['id'].Value); ATiempoProxHoras.TiempoHora[i].Weather.main := GetAsString(oWeather.Field['main'].Value); ATiempoProxHoras.TiempoHora[i].Weather.desc := GetAsString(oWeather.Field['description'].Value); ATiempoProxHoras.TiempoHora[i].Weather.icon := GetAsString(oWeather.Field['icon'].Value); end; Result := True; except // si hay error, FALSe Result := False; end; end; |
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…