2013-11-04 82 views
1

我們爲我們的網站提供了XML和JSON作爲返回格式的API。兩者都來自PHP陣列。我的JSON返回是什麼導致我的問題。如何返回相同的名稱元素而不是[0],1等?現在,我回來的樣子:創建具有相同名稱元素的json?

{ 
"rate": { 
    "rate_span": "1 Minute", 
    "rate_limit": "60", 
    "rate_remaining": 59, 
    "rate_user": "60" 
}, 
"status": { 
    "status_code": 200, 
    "status_message": "Request was successful." 
}, 
"favorites": { 
    "0": { 
     "favorite": { 
      "lyric_id": "570" 
     } 
    }, 
    "1": { 
     "favorite": { 
      "lyric_id": "3530822107858532003" 
     } 
    }, 
    "2": { 
     "favorite": { 
      "lyric_id": "3530822107858535795" 
     } 
    }, 
    "favorites_type": "lyrics", 
    "favorites_total": 3 
} 
} 

我寧願每個喜歡被包裹在它自己的「最愛」 {...元素和旁路每個陣列被包裹在[0],1,[X + 1] ....很像此JSON響應:ARTIST.ALBUMS.GET JSON

這是PHP陣列構建的收藏部...

$json["favorites"] = array(); 
$json["favorites"]["favorites_type"] = "lyrics"; 
$json["favorites"]["favorites_total"] = $userFavorites->recordCount(); 

foreach($userFavorites as $key => $fav) { 
    $song_id = $fav["lyric_id"]; 
    $json["favorites"][]["favorite"]["lyric_id"] = $song_id; 
} 
+0

你能告訴我們哪裏產生的JSON的代碼?你想讓它看起來像什麼? – 2013-11-04 03:50:56

+0

請注意,您鏈接的示例仍然將每個項目放入其自己的子對象中,但是具有「{」0「:{...},」1「:{...}}的位置,它具有'[{...},{...}]' - 包裝的*數量是相同的,它只是一個稍微不同的*類型的包裝。 – IMSoP

+0

@IMSoP我遵循這一點。我想我不明白他們如何包裝數據看起來像那樣。 – Mike

回答

1

JSON有兩種結構: 「陣列」,其具有命令,但沒有鍵和一個「對象」(哈希),它有鍵但沒有順序。另一方面,PHP將這些組合到一個結構中,它稱之爲「數組」,它具有鍵的順序。因此,PHP的json_encode函數必須選擇將哪個JSON結構用於特定的PHP數組。

在您的數據中,PHP數組$json['favourites']包含字符串鍵(例如$json["favorites"]["favorites_type"])和自動遞增的數字鍵(您已使用$json["favorites"][])。由於字符串鍵不能存在於JSON數組中,因此PHP的json_encode將不得不將其編碼爲JSON對象,這就是爲什麼在輸出中看到鍵"0":,"1":等(這些鍵與您看到的鍵相同如果您在陣列上使用了print_r)。

如果您從該數組中刪除字符串鍵(將該數據移動到結構中的其他位置),則剩下的就是數字數組。由於這就像一個JSON數組,PHP將輸出它,並且在輸出中不會看到鍵。

正如我在評論中指出,各地各項目捆綁的保持不變 - 要素不具有「相同的名稱」,他們只是存在於一個有序的結構,而不是關聯的。

這裏是a code demo

$json["favorites"] = array(); 
$json["favorites"]["favorites_type"] = "lyrics"; 

// Simlulating entries in loop: 
$json["favorites"][] = array('favourite' => array('lyric_id' => 3530822107858532003)); 
$json["favorites"][] = array('favourite' => array('lyric_id' => 3530822107858535795)); 

echo "BEFORE:"; 
echo json_encode($json, JSON_PRETTY_PRINT); 

// Remove the problematic string key: 
unset($json["favorites"]["favorites_type"]); 

echo "<br>"; 

echo "AFTER:"; 
echo json_encode($json, JSON_PRETTY_PRINT); 

輸出:

BEFORE:{ 
    "favorites": { 
     "favorites_type": "lyrics", 
     "0": { 
      "favourite": { 
       "lyric_id": 3530822107858532003 
      } 
     }, 
     "1": { 
      "favourite": { 
       "lyric_id": 3530822107858535795 
      } 
     } 
    } 
} 
AFTER:{ 
    "favorites": [ 
     { 
      "favourite": { 
       "lyric_id": 3530822107858532003 
      } 
     }, 
     { 
      "favourite": { 
       "lyric_id": 3530822107858535795 
      } 
     } 
    ] 
} 
+0

哇!很好的答案。除了解決方案之外,我非常感謝您花時間解釋我做錯了什麼。 – Mike

相關問題