2012-05-26 100 views
6

我認爲這是一個非常基本的問題,但我花了好幾個小時尋找答案,沒有運氣,我有下面的json對象(使用play!Framework生成)如何使用jquery解析json對象

{ 
    "preg.pregunta": [{ 
     "message":"Debes escribir una pregunta", 
     "key":"preg.pregunta", 
     "variables":[] 
    }], 
    "preg":[{ 
     "message": "validation.object", 
     "key":"preg", 
     "variables":[] 
    }] 
} 

這是我的jQuery的代碼

$.ajax({ 
    type: $target.attr('method'), 
    data: dataString, 
    url:$target.attr('action'), 
    dataType: "json", 
    beforeSend: function() { 
     //some stuff 
    }, 
    success:function(response){ 
     //some stuff 
    }, 
    error: function(response){ 
     //I want to use the json response here. 
    } 
}); 

我想所有的內部preg.preguntamessagekey值)

有什麼幫助嗎?

已更新:好吧,我沒有足夠的聲望回答自己,這是我迄今爲止發現的。

好吧,也許它會更明顯,或者我有更多的研究;我發現,如果jQuery響應HTTP錯誤(本例中爲400),jQuery不會正確解析JSON響應。

有人知道爲什麼會有這種行爲?

我剛剛在success處理程序中測試了這段代碼,並且完美地工作!

$.ajax({ 
    type: $target.attr('method'), 
    data: dataString, 
    url:$target.attr('action'), 
    dataType: "json", 
    beforeSend: function() { 
    }, 
    success:function(response){ 
    //It is working perfectly! 
    $.each(response,function(object){ //first loop of the object 
     $.each(response[object],function(values){ //looping inside arrays 
     console.log(response[object][values].key) //getting value "key" 
     console.log(response[object][values].message) //getting value "message" 
     }); 
    }) 
    }, 
    error: function(response){ 
    //nothing happens here 
    } 
}); 

修訂2.

搜索約2小時後,我發現一個簡單的解決方案:

error: function(response){ 
//Note the jQuery.parseJSON function 
var response = jQuery.parseJSON(response.responseText); 
    $.each(response,function(object){ 
    $.each(response[object],function(values){ 
     console.log(response[object][values].key) 
     console.log(response[object][values].message) 
    }); 
    }) 
} 

說明:使用錯誤處理程序時,jQuery的返回描述錯誤的複雜對象,responseText包含從服務器獲取的數據,因此,您必須使用parseJSON函數解析它。

希望這會有所幫助!

回答

2

試試這個:

error: function(response) { 
    var pregunta = response["preg.pregunta"][0].message; 
    var key = response["preg.pregunta"][0].key; 
}, 

如果有在preg.pregunta陣列內的多個值,你就需要循環,並與你的迭代變量替換[0]

此外,我不明白爲什麼你只想訪問error處理程序中的響應?

最後,訪問JSON的代碼是原生javascript。這是因爲當您收到響應時,它已被轉換爲POJS對象,不需要jQuery。

+0

嗨!我已經嘗試過,但沒有成功,「響應['preg.pregunta']未定義」 –

+0

當您嘗試以下操作時,您在控制檯中看到了什麼:'console.log(response);'? –

+0

Hi Rory,我的回答很簡單;我正在使用playframework驗證器驗證字段,如果發現任何錯誤(例如字段爲空),則會返回一個呈現爲JSON的validation.errorsMap()對象,以便稍後使用它,此響應將返回「HTTP 400' ...所以這就是爲什麼我用'error'處理程序來捕獲它。 –