2012-07-10 110 views
6

我想输出一个使用PHP和MySQL的JSON字符串,但经度和纬度输出为带有引号的字符串值。当我尝试将标记添加到谷歌地图时,这会导致问题。PHP JSON编码输出数字为字符串

这里是我的代码:

$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 "}"; 

这里是预期输出:

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

这里是我得到的输出:

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

注意周围的引号纬度和经度值。

回答

17

您也可以尝试

echo json_encode($results, JSON_NUMERIC_CHECK); 

一些参考:

PHP JSON constants

+0

这些JSON_ *常量在要求中相当重要:) – 2012-07-10 03:06:13

+0

请注意,这只适用于PHP> = 5.3。如果你需要支持旧版本(许多网站在编写PHP 5.2的时候),@Allen Chak的回复相当不错 – kakoma 2014-12-04 09:25:40

+0

你为我节省了很多时间。 – Jordy 2015-02-06 12:35:51

0

只要做到:

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

这应该工作。

+1

不一定安全,因为存在将被删除引号的字符串值 – Austin 2012-07-10 03:01:37

0

有效JSON必须的值和双引号内的键。 有双引号的问题是什么?

+2

不正确,键必须位于双引号内,但数字值不一定必须为有效。 – Mahn 2012-07-10 03:11:36

+0

是的,你是对的,但我无法应付那需要5.3.3的JSON_NUMERIC_CHECK(只是:>)。 TX。 – 2012-07-11 03:03:49

0

使用JavaScript的parseInt()在客户端打开字符串值到必要的整数:

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'] 
); 

经纬度应该是一个浮点数,但你可以试试这个

+0

我喜欢这种方法。它只会投射需要的值。 – kakoma 2014-12-04 09:24:03

1

这里的东西,你可能不知道:从MySQL在PHP中检索数据时,你会总是得到串回来,无论什么实际价值是。一个简单的类型转换为float应该可以解决,不过问题:

$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 "}"; 

或者,因为浮动可能不够准确存储纬度/经度坐标,做他们存储为字符串,并删除在飞行中使用字符串引号操纵函数,如str_replace。