Tengo un problema con la función PHP json_encode. Codifica los números como cadenas, p. Ej.
array('id' => 3)
se convierte
"{ ["id": "3", ...)
Cuando js encuentra estos valores, los interpreta como cadenas y las operaciones numéricas fallan en ellos. ¿Alguien sabe alguna forma de evitar json_encode
codificar números como cadenas? ¡Gracias!
php
javascript
json
Chris Barnhill
fuente
fuente
Respuestas:
He hecho una prueba muy rápida:
Esto parece ser lo que usted describe, si no me equivoco?
Y estoy obteniendo como salida:
Entonces, en este caso, los enteros no se han convertido a cadena.
Aún así, esto podría depender de la versión de PHP que estamos usando: se han corregido un par de errores relacionados con json_encode, dependiendo de la versión de PHP ...
Esta prueba se ha realizado con PHP 5.2.6; Estoy obteniendo lo mismo con PHP 5.2.9 y 5.3.0; Sin embargo, no tengo otra versión 5.2.x para probar :-(
¿Qué versión de PHP estás usando? ¿O es su caso de prueba más complejo que el ejemplo que publicó?
¿Quizás un informe de error en http://bugs.php.net/ podría estar relacionado? Por ejemplo, Bug # 40503: ¿la conversión de enteros json_encode es inconsistente con PHP ?
Tal vez el error # 38680 también podría interesarte, por cierto.
fuente
Tenga en cuenta que desde PHP 5.3.3, hay un indicador para los números de conversión automática (el parámetro de opciones se agregó en PHP 5.3.0):
fuente
JSON_NUMERIC_CHECK
intenta adivinar automáticamente si una cadena es un número o no al intentar analizarla. Eso es bastante poco confiable si lo piensas. Convertirá todas las propiedades de aspecto numérico en números (no solo las que desee) y lo hará solo si parecen números. Eso es al menos inestable si no inseguro. El código que consume el JSON producido podría depender de que el tipo sea uno u otro. Cosas extrañas pueden suceder si esas expectativas no se cumplen. Si le interesan las buenas prácticas y la seguridad, debe convertir selectivamente los valores que desee.Yo, también estaba leyendo desde un DB (PostgreSQL) y todo era una cadena. Recorremos cada fila y hacemos cosas con ella para construir nuestra matriz de resultados finales, así que utilicé
dentro del bucle para forzarlo a ser un valor entero. Cuando lo hago
json_encode($result_arr)
ahora, lo formatea correctamente como un número. Esto le permite controlar lo que es y no es un número proveniente de su base de datos.EDITAR:
los
json_encode()
función también tiene la capacidad de hacer esto sobre la marcha utilizando laJSON_NUMERIC_CHECK
bandera como segundo argumento. Sin embargo, debe tener cuidado al usarlo, como se muestra en este ejemplo de usuarios en la documentación (copiada a continuación): http://uk3.php.net/manual/en/function.json-encode.php#106641Y luego obtienes este JSON:
fuente
json_encode
función. esta es la respuesta más correcta, pero tenga cuidado ya queJSON_NUMERIC_CHECK
también convierte números de teléfono y otros valores de cadena numéricos, y esto podría dar problemas en ceros a la izquierda o '+' ... Sugiero corregir este problema en la función de lectura de DB.tratar
$arr = array('var1' => 100, 'var2' => 200);
$json = json_encode( $arr, JSON_NUMERIC_CHECK);
Pero solo funciona en PHP 5.3.3. Mire este registro de cambios PHP json_encode http://php.net/manual/en/function.json-encode.php#refsect1-function.json-encode-changelog
fuente
Me encuentro con el mismo problema (PHP-5.2.11 / Windows). Estoy usando esta solución
que reemplaza todos los números (no negativos, enteros) entre comillas con el número mismo ('"42"' se convierte en '42').
Vea también este comentario en el manual de PHP .
fuente
$json_array = json_encode($some_array, false);
Entonces el argumento falso le dice a PHP que no haga la conversión de objetos.json_encode(array(-1=>'que', '0'=>'-1'))
$this->data = preg_replace("/\" *?: *?(\d+)/", '":"$1"', $this->data);
La siguiente prueba confirma que cambiar el tipo a cadena hace que json_encode () devuelva un valor numérico como una cadena JSON (es decir, rodeado de comillas dobles). Use settype (arr ["var"], "integer") o settype ($ arr ["var"], "float") para arreglarlo.
fuente
En aras de la exhaustividad (ya que todavía no puedo agregar comentarios), permítanme también agregar este detalle como otra respuesta:
(Editar: para leer después de darse cuenta de que los datos de origen (es decir, en el caso del OP, conjunto de resultados de la base de datos) podrían ser el problema (devolviendo columnas numéricas como cadenas), y json_encode () de hecho no fue el origen del problema)
Páginas del manual de ambos " mysql_fetch_array ":
... y " mysql_ fetch_ row ":
establece claramente que; Las entradas en la matriz devuelta serán cadenas.
(Estaba usando la clase DB en phpBB2 (sí, lo sé, ¡está obsoleto!), Y el método "sql_fetchrow ()" de esa clase usa "mysql_fetch_array ()")
Sin darme cuenta, ¡también terminé encontrando esta pregunta y entendiendo el problema! :)
Como Pascal Martin declaró anteriormente en sus comentarios de seguimiento, creo que una solución que se ocupa del problema del "tipo incorrecto" en la fuente (es decir, mediante el uso de la función " mysql_field_type () " y haciendo el casting justo después de buscar, (o otros métodos de búsqueda como "objeto"?)) serían los mejores en general.
fuente
Entonces Pascal MARTIN no está recibiendo suficiente crédito aquí. Comprobar los valores numéricos en cada declaración JSON no es factible para un proyecto existente con cientos de funciones del lado del servidor.
Reemplacé php-mysql con php-mysqlnd, y el problema desapareció. Los números son números, las cadenas son cadenas, los booleanos son booleanos.
fuente
También tuve el mismo problema al procesar datos de la base de datos. Básicamente, el problema es que el tipo en la matriz para convertir en json es reconocido por PHP como una cadena y no como un entero. En mi caso, realicé una consulta que devuelve datos de una fila de conteo de columnas DB. El controlador PDO no reconoce la columna como int, sino como cadenas. Lo resolví realizando un reparto como int en la columna afectada.
fuente
fuente
es la versión de php el problema, tuve el mismo problema actualizado mi versión de php a 5.6 resolvió el problema
fuente
La conversión de los valores a un int o flotante parece solucionarlo. Por ejemplo:
fuente
¡Puede usar (int) si ocurre algún problema! Funcionará bien
fuente
Simplemente me encontré con el mismo problema y la base de datos devolvió los valores como cadenas.
Lo uso como una solución alternativa:
Eso es multiplicar el valor por 1 para convertirlo en un número
Espero que ayude a alguien
fuente
json_encode serializa alguna estructura de datos en formato JSON para enviarla a través de la red. Por lo tanto, todo el contenido será del tipo cadena. Al igual que cuando recibe algún parámetro de $ _POST o $ _GET.
Si tiene que realizar operaciones numéricas en los valores enviados, simplemente conviértalos a int primero (con la función intval () en PHP o parseInt () en Javascript) y luego ejecute las operaciones.
fuente
Bueno, PHP json_encode () devuelve una cadena.
Sin embargo, puede usar parseFloat () o parseInt () en el código js:
fuente
Como dijo oli_arborum, creo que puedes usar a
preg_replace
para hacer el trabajo. Simplemente cambie el comando así:fuente