2011-04-21 96 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'}] 只是那个对象传递给您的验证程序。如果可能的话,我会更改服务器代码以我建议的格式返回错误消息,这样您就不必执行额外的工作。