从嵌套的JSON中获取值

时间:2014-08-29 17:03:43

标签: jquery json

我正在使用带有ember-data的ember,我需要从嵌套的错误响应中获取值。

如果我的后端无效,它可能会回复如下:

{"error":{"message":{"invalid input":{"email":["The email has already been taken."]}}}} 

但是,我不知道第3或第4个嵌套值是什么,所以我只需要取第5个值,即错误信息。

这就是我所拥有的:

function onSuccess(){
    this.transitionTo('login');
    Notify.success("You are now registered! You can now login.");
};
function failure(reason){
    Notify.alert(reason.responseText.5);
};
...
//Omitted for brevity.
...
//Ember promise returns true or false. 
user.save().then(onSuccess).catch(failure);

如果你能用我喜欢的数字把它拔出来,那将会很有吸引力,但很明显它并不像那样。是否有一个函数,ember或jQuery允许我这样做?

2 个答案:

答案 0 :(得分:1)

这样的事情(或其变体)可以起作用:

var e = {"error":{"message":{"invalid input":{"email":["The email has already been taken."]}}}} ;

function GetDeepest(obj) {
    if (typeof obj === "string") {
        return obj;
    }
    else if (typeof obj === "object") {
        return GetDeepest(obj[Object.keys(obj)[0]]);
    }
}

console.log(GetDeepest(e));

http://jsfiddle.net/aaku72n0/

它将检查传入的对象是否是字符串,如果不是,它将使用对象的第一个属性递归。这假设没有兄弟姐妹(或者至少,你只想沿着每个级别的第一个兄弟姐妹走下去),但可以进行调整。

如果您知道它始终处于第5级,则可以进一步简化。

此函数并不关心字符串嵌套的深度。它会一直搜索,直到找到它为止。所以这些都会得到相同的结果:

GetDeepest(e);
GetDeepest(e.error);
GetDeepest(e.error.message);

答案 1 :(得分:1)

function pluck(object) {
    return object[Object.getOwnPropertyNames(object)[0]];
}

function failure(reason){
    var message = reason.error.message;  //let's skip two levels right away
    var messageText = pluck(pluck(message))[0];
};