2012-07-10 114 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。