我創建一個處理JSON輸入(通過$ _POST變量)的PHP腳本。它從JSON中提取數據並將其上載到SQL數據庫。我想JSON以特定的格式:json_encode更改數組與對象
$object = json_decode('{
"key_a":[{"value_a":10,"value_b":7},{"value_a":10,"value_b":7},{"value_a":10,"value_b":7}],
"key_b":[{"value_a":10,"value_b":7}],
"key_c":[{"value_a":10,"value_b":7},{"value_a":10,"value_b":7}]
}',true);
基本上,除了按鍵的對象,每個應保存數組(不管它的大小是)。我使用json_decode(json,true)將其轉換爲關聯數組(而不是對象)。我必須爲每個鍵添加大量檢查,檢查它們是否爲「對象或數組」(因爲抽取的ASP.net頁面將數組轉換爲對象中的單個對象 - 刪除數組持有他們)。支票然後將它們轉換回陣列,如果有「S的物體,其中我」 D喜歡的陣列保持的對象:
if(is_object($object["key_b"]))
{
$a = array();
$a[] = $object["key"];
$object["key"] = $a;
}
然後我通過陣列迭代,加入值的行在SQL數據庫中。這一切工作正常,但與json_encode轉換回JSON時,在只有一個對象持有陣列的任何鍵,刪除陣列,以及鍵下只留下對象:
echo(json_encode($object));
// RETURNED JSON
'{
"key_a":[{"value_a":10,"value_b":7},{"value_a":10,"value_b":7},{"value_a":10,"value_b":7}],
"key_b":{"value_a":10,"value_b":7},
"key_c":[{"value_a":10,"value_b":7},{"value_a":10,"value_b":7}]
}'
你看,key_b沒有更長的持有一個數組,但一個對象!這真的很煩人,因爲我打算創建一個遍歷數組的JavaScript腳本,爲每個對象添加一個DOM元素(div)。
爲什麼會發生這種情況?有什麼辦法讓他們爲數組,即使有試過「數組中的唯一一個對象
我?」:
if(is_object($object["key_b"]))
{
$a = array();
$a[] = array_values($object["key"]);
$object["key"] = $a;
}
和
if(is_object($object["key_b"]))
{
$a = array();
$a[0] = array_values($object["key"]);
$object["key"] = $a;
}
但好像沒有什麼能夠阻止json_encode以這種方式影響JSON。
解決這個問題並不難 - 但它意味着每個鍵添加一個檢查(檢查它是一個數組還是值),當數據抽取真的很大時,這特別耗時。
任何意見將不勝感激。
編輯:改變「,以」在JSON - 儘管,這只是一個例子,我剛寫來顯示結構
編輯:我使用引用把我的編碼時間下來,如果這個改變任何東西?:
$t =& $object["key_b"];
if(is_object($t))
{
$a = array();
$a[] = $t;
$t = $a;
}
Javascript/JSON調用「對象」和PHP調用對象的內容大相徑庭。 '$ object [「key」]'究竟是什麼?你的代碼是否在被執行? – deceze 2014-09-05 15:15:22
我只是寫它作爲一個例子 - 這不是我使用的實際JSON,對不起。 – 2014-09-05 15:15:44
嗯,好問題,欺騙 - 我不確定!我對待這個像javascript對象/數組。 – 2014-09-05 15:16:38