2011-04-21 94 views
1

鑑於JSON響應一個表單,我需要通過JSON元素解析來查找與它們相關聯的元素的錯誤消息,這個錯誤是綁定的。如何獲取數組對象的鍵?

的數據被返回JSON格式與錯誤消息作爲最後的變量對看起來像這樣:沿

"invalid":[{"field1":"Field 1 is required"}] 

這結束了具有用於表示該項目的名稱(鍵)的每個錯誤的對象/陣列與該字段相關的錯誤。鑑於我的錯誤處理表單不知道鍵名是什麼,我該如何獲取這個對象/數組的鍵和值?

我在這個項目上使用dojo,我不熟悉它,所以我一直試圖在可能的情況下使用dojo函數,如果有東西存在可以處理這個。目前,有我在哪裏:

var retObj = dojo.fromJson(ioargs.xhr.responseText); 

dojo.forEach(retObj.invalid, function(entry,i){ 
    console.debug(entry); 
}); 

控制檯輸出爲:

Object { field1="Field 1 is required"} 

我的目標是拉出值「字段1」,所以我知道該輸入字段這個錯誤被分配到,然後將field1的值分配給該錯誤字段。

謝謝!

+1

關於解析JSON有太多的問題。 – Zirak 2011-04-21 16:22:09

+0

'console.debug(entry)'輸出什麼? – bh88 2011-04-21 16:22:47

+0

你已經在迭代數組的元素,所以我認爲你的問題不是關於數組。我將搜索「如何檢索對象(或關聯數組)的屬性(或鍵)」。例如。請參閱http://www.quirksmode.org/js/associative.html。例如。把'for(var key in entry){... entry [key] ...}'放到你傳遞給forEach的函數中。 – LarsH 2011-04-21 16:27:31

回答

1

不知道關於Dojo的一件事,但你正在尋找一個非常基本的for in循環。

var retObj = dojo.fromJson(ioargs.xhr.responseText), 
    invalids = retObj.invalid[0], 
    res = {}; //here will be your final key=>value 

for (var key in invalids) { 
    res[key] = invalids[key]; 
} 

http://jsfiddle.net/DgXkq/

您可能也有興趣https://stackoverflow.com/search?q=%5Bjavascript%5Dparsing+json

+0

這與我正在尋找的東西非常接近,但我如何獲得關鍵名稱。在你的小提琴示例中,它返回每個鍵的值,但不是鍵名。在我的情況下,鍵名實際上是錯誤所屬的輸入的ID。所以我需要能夠獲取密鑰的名稱以知道該密鑰的值。希望這是有道理的?這是一個複雜的問題,因爲我確信有一個特定的詞。 – XOPJ 2011-04-21 16:42:56

+2

在for循環中,'key'是關鍵名稱。 – Zirak 2011-04-21 16:55:21

0

有沒有辦法找到一個對象的關鍵,如果你不能夠訪問的父對象。我相信在這種情況下最好的解決方案是按摩JSON以將更多有意義的信息傳遞給驗證器,即具有兩個屬性fieldName和errorMessage的對象。

// Returns the name of an object's first key 
function getKeyName(obj) { 
    for (var prop in obj) { 
     return prop; 
    } 
} 

// This is the response from the server 
var response = { "invalid":[{"field1":"Field 1 is required"}] }; 

// This is going to be the massaged array that 
// contains more meaningful information. 
var invalids = []; 
for (var i=0; i < response.invalid.length; i++) { 
    var obj = response.invalid[i]; 
    var key = getKeyName(obj); 
    invalids.push({fieldName: key, errorMessage: obj[key]}) 
} 

現在invalids包含更有意義的錯誤消息的數組對象,如 invalids = [{fieldName: 'field1', errorMessage: 'Field 1 is required'}] 只是那個對象傳遞給您的驗證程序。如果可能的話,我會更改服務器代碼以我建議的格式返回錯誤消息,這樣您就不必執行額外的工作。