Nueva pregunta

Pregunta:

Fecha: 16-01-2018 02:47:35 (En Español)

$.getJSON TypeError: a is null, string con datos y los procesa parcialmente[Resuelta]

Hola a todos.

Si bien el problema está resuelto (no estoy cómodo con la solución), merece la pena saber cual es el error y buscar la mejor solución. La referencia a is null es como decir mir variable is null.

Descargo un JSON, en este caso, del Ministerio de Industria y Energía. Se trata de los precios de combustibles con su ubicación de algo más de 10120 estaciones de servicio y 28 datos por cada estación.

Al recorrer los datos mediante $.getJSON, no se aprecian problemas excepto en la latitud y longitud (qué casualidad).
Hay texto ( como 'Precio Gases licuados del petróleo' o direcciones) y "números" (precios y ... coordenadas), separados por comas y que son tratados no como number sino como string..

Solamente en las coordenadas (latitud y longitud) me aparece un error, no en su lectura directa sino cuando trato de cambiar la coma [,] por punto [.] (replace()) que necesariamente he de hacerlo.
var lat = mydata[i].Latitud;
lat = lat.replace(",", ".");  // aparece el error en el segundo lat
var lng = mydata[i].Longitud;
lng = lng.replace(",", ".");   // idem, el mismo error 

El error aparece cuando presento lat.replace() y lng.replace()
TypeError: lat is null vs. lng is null
typeof me dice que es string y después lo paso a coordenadas y me las lee (), pero hay otras funciones donde las coordenadas no trabajan (la que más me importa es new google.maps.LatLngBounds();).

Al final (después de ... ) surgió una solución que la considero chapucera, pero que funciona.
var lat = ''+mydata[i].Latitud;  // ¡el milagro!
lat = lat.replace(",", ".");
var lng = ''+mydata[i].Longitud;
lng = lng.replace(",", ".");
var latlng = new google.maps.LatLng(parseFloat(lat), parseFloat(lng)); // pasemos a valor numérico, que me importa

Los errores desaparecen y las funciones se clumplen.

Pregunta 1.- ¿Cual es la explicación del error? (la intuyo pero no la comprendo)
Pregunta 2.- ¿Hay alguna solución "menos sucia" de solucionarlo?

Gracias anticipadas.
Etiquetas: $_GET - Error - Javascript - JQuery Votos: 1 - Respuestas: 4 - Vistas: 7 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 16-01-2018 05:35:52 Hola Txema,
    Tienes algunos ejemplos de latitud y longitud que puedas compartir?

    Creo que sé cuál es el problema pero necesito ver algunos datos de ejemplo para confirmar
      Votos: 0 - Link respuesta
     
  • Fecha: 16-01-2018 06:17:31 Lo estoy trabajando en local. Así que te muestro parte del JSON
    {
        "Fecha": "16\/01\/2018 5:29:05",
        "ListaEESSPrecio": [{
            "C.P.": "01240",
            "Dirección": "CL MANISITU, 9",
            "Horario": "L-D: 24H",
            "Latitud": "42,846028",
            "Localidad": "ALEGRIA-DULANTZI",
            "Longitud (WGS84)": "-2,509361",
            "Margen": "D",
            "Municipio": "Alegría-Dulantzi",
            "Precio Biodiesel": null,
            "Precio Bioetanol": null,
            "Precio Gas Natural Comprimido": null,
            "Precio Gas Natural Licuado": null,
            "Precio Gases licuados del petróleo": null,
            "Precio Gasoleo A": "1,169",
            "Precio Gasoleo B": "0,726",
            "Precio Gasolina 95 Protección": null,
            "Precio Gasolina  98": null,
            "Precio Nuevo Gasoleo A": null,
            "Provincia": "ÁLAVA",
            "Remisión": "dm",
            "Rótulo": "PREMIRA ENERGIA NORTE, S.L.",
            "Tipo Venta": "P",
            "% BioEtanol": "0,0",
            "% Éster metílico": "0,0",
            "IDEESS": "9381",
            "IDMunicipio": "1",
            "IDProvincia": "01",
            "IDCCAA": "16"
        }, {
            "C.P.": "01468",
            "Dirección": "POLIGONO ZANKUETA, 0",
            "Horario": "L-D: 24H",
            "Latitud": "43,044333",
            "Localidad": "LARRINBE",
            "Longitud (WGS84)": "-2,989111",
            "Margen": "D",
            "Municipio": "Amurrio",
            "Precio Biodiesel": null,
            "Precio Bioetanol": null,
            "Precio Gas Natural Comprimido": null,
            "Precio Gas Natural Licuado": null,
            "Precio Gases licuados del petróleo": null,
            "Precio Gasoleo A": "1,119",
            "Precio Gasoleo B": null,
            "Precio Gasolina 95 Protección": "1,209",
            "Precio Gasolina  98": "1,299",
            "Precio Nuevo Gasoleo A": "1,189",
            "Provincia": "ÁLAVA",
            "Remisión": "dm",
            "Rótulo": "ESTACIONES GB",
            "Tipo Venta": "P",
            "% BioEtanol": "0,0",
            "% Éster metílico": "0,0",
            "IDEESS": "13543",
            "IDMunicipio": "2",
            "IDProvincia": "01",
            "IDCCAA": "16"
        }, {   //   ...   continúa ...
        }]
    }

    En longitud tenemos tanto valores positivos como negativos.

    Y en Javascript (jquery 3.2.1 aunque lo he probado con versiones anteriores 2. y 1.)
    $.getJSON('JSON/preciosEESS.json', function(data) {
            bounds = new google.maps.LatLngBounds();
            var Fecha = data.Fecha;
            var nota = data.Nota;
            var mydata = data.ListaEESSPrecio;
            for (var i = 0; i < mydata.length; i++) {
                var direccion = mydata[i].Dirección + ', <br>' + mydata[i].Localidad + ' (' + mydata[i].Provincia + ')';
                var lat = ''+mydata[i].Latitud;
                var lat = lat.replace(",", ".");
                var lng = ''+mydata[i]['Longitud (WGS84)'];
                var lng = lng.replace(",", ".");
                var latlng = new google.maps.LatLng(parseFloat(lat), parseFloat(lng));
    // y continúa leyendo precios y productos, etc
    
      Votos: 0 - Link respuesta
     
  • Fecha: 16-01-2018 09:23:11 Txema,
    Creo que te respondiste tú solo en tu segundo comentario jejeje, la propiedad 'Longitud' debe ser 'Longitud (WG)'
    La parte donde haces:

    var variable = ''+mydata[i]['propiedad'];
    


    Es una manera 'antigua' de hacer un casting a string. En este caso no es necesario porque ya es un string.

    Curiosamente después de remplazar las ',' con '.' ya no es necesario hacer el 'parseFloat'.

    Puedes ver por qué en el siguiente fiddle donde verás que una vez que utilizas 'replace' el intérprete convierte la variable a tipo numérico (float).

    Ojo que en mi caso estoy usando Chrome con JS 1.7
      Votos: 1 - Link respuesta
     
  • Fecha: 16-01-2018 11:13:03 Gracias Ernesto.

    El hecho de tomar los valores así es porque tengo muchas claves con espacios internos. De los valores me preocupo menos porque seguirán siendo tratados como string.

    Es como llega el JSON directamente y actualizado cada media hora.

    Por ejemplo:
    var lat = ''+mydata[i].Latitud;
    var lng = ''+mydata[i]['Longitud (WGS84)'];
    // o más adelante
    var gasesLicuadosPetroleo = mydata[i]['Precio Gases licuados del petróleo'];
    var gasolina95 = mydata[i]['Precio Gasolina 95 Protección'];
    var marca = mydata[i].Rótulo;


    El uso de 'parseFloat' viene dado (o me lo justifico) porque después del replace(',', '.') typeof(lat) y typeof(lng) me siguen indicando que son string y no está de más asegurarse de que los valores sean numéricos.

    En este caso son 10124 marcadores y estoy obligado a trabajar con LatLngBounds() y con MarkerClusterer(), sensibles al tratamiento de las coordenadas.

    Gracias porque con console.log(isNaN(lat)) lo he visto claro. No suelo usarlo con tanto registro ya que ralentizo tremendamene la página (paso de un segundo a 4-5segundos), y este error es la primera vez que me ocurre.

    Lo habitual suelen ser json tomados desde xml o excel a través de php con json_encode y no tengo problemas.

    Con las nuevas situaciones seguimos aprendiendo algo más.

    Gracias
      Votos: 1 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com