2012-07-10 6 views
6

Estoy tratando de generar una cadena JSON usando PHP y MySQL, pero la latitud y la longitud están dando como resultado una cadena con comillas alrededor de los valores. Esto causa un problema cuando intento agregar los marcadores a un mapa de Google.PHP JSON codifica el número de salida como la cadena

Aquí está mi código:

$sql = mysql_query('SELECT * FROM markers WHERE address !=""'); 
$results = array(); 
while($row = mysql_fetch_array($sql)) 
{ 
    $results[] = array(
     'latitude' =>$row['lat'], 
     'longitude' => $row['lng'], 
     'address' => $row['address'], 
     'project_ID' => $row['project_ID'], 
     'marker_id' => $row['marker_id'] 
    ); 
} 
$json = json_encode($results); 

echo "{\"markers\":"; 
echo $json; 
echo "}"; 

Aquí es el resultado esperado:

{"markers":[{"latitude":0.000000,"longitude":0.000000,"address":"2234 2nd Ave, Seattle, WA","project_ID":"7","marker_id":"21"}]} 

Aquí está la salida que me estoy haciendo:

{"markers":[{"latitude":"0.000000","longitude":"0.000000","address":"2234 2nd Ave, Seattle, WA","project_ID":"7","marker_id":"21"}]} 

Aviso las comillas alrededor de la valores de latitud y longitud

Respuesta

17

También puede probar

echo json_encode($results, JSON_NUMERIC_CHECK); 

Algunos de referencia:

PHP JSON constants

+0

estas constantes JSON_ * son bastante pesadas en los requisitos :) –

+0

Tenga en cuenta que esto solo funciona para PHP> = 5.3. Si necesita admitir versiones anteriores (varios sitios ejecutan PHP 5.2 al momento de escribir esto), la respuesta de @Allen Chak es bastante buena – kakoma

+0

Me ha ahorrado muchísimo tiempo. – Jordy

0

Just Do:

echo str_replace('"','',$json); 

que debería funcionar.

+1

No es necesariamente seguro, ya que hay valores de cadena que serán despojados de sus comillas – Austin

0

válido JSON debe tener los valores y las llaves entre comillas dobles. ¿Cuál es el problema de tener comillas dobles?

+2

No verdadero, las claves deben estar entre comillas dobles, pero los valores numéricos no necesariamente tienen que ser válidos. – Mahn

+0

sí, tienes razón pero no puedo lidiar con ese JSON_NUMERIC_CHECK (por ahora:>) que necesita 5.3.3. tx. –

0

utilizar Javascript parseInt() en el lado del cliente para convertir los valores de cadena en enteros cuando sea necesario:

typeof parseInt("56") # returns number 
typeof "56" # returns string 
2
$results[] = array(
    'latitude' => (float)$row['lat'], 
    'longitude' => (float)$row['lng'], 
    'address' => $row['address'], 
    'project_ID' => $row['project_ID'], 
    'marker_id' => $row['marker_id'] 
); 

latitud y longitud debe ser un número flotante, pero se podía probar este

+0

Me gusta este enfoque. Solo arroja los valores que necesitan ser. – kakoma

1

Aquí hay algo que no puede saber: cuando se recuperan datos de MySQL en PHP, se quiere siempre obtener cadenas de espalda, no importa lo que el actual el valor es Una simple conversión de tipos de flotar debe solucionar el problema, sin embargo:

$sql = mysql_query('SELECT * FROM markers WHERE address !=""'); 
$results = array(); 
while($row = mysql_fetch_array($sql)) 
{ 
    $results[] = array(
     'latitude' => (float) $row['lat'], 
     'longitude' => (float) $row['lng'], 
     'address' => $row['address'], 
     'project_ID' => $row['project_ID'], 
     'marker_id' => $row['marker_id'] 
    ); 
} 
$json = json_encode($results); 

echo "{\"markers\":"; 
echo $json; 
echo "}"; 

O, alternativamente, porque los flotadores pueden no ser lo suficientemente precisos para almacenar las coordenadas de latitud/longitud, hacer almacenarlos en forma de cadenas y quitar las comillas sobre la marcha utilizando cuerdas funciones de manipulación como str_replace.

Cuestiones relacionadas