jQuery新手求助:如何从AJAX返回的JSON中获取键值对
问题分析与解决方案
看起来你遇到的问题根源出在后端返回的JSON格式和前端预期不匹配上,我们一步步来拆解:
问题所在
你的VB后端代码里,直接序列化并返回了单个数值:
Return JsonConvert.SerializeObject(FacilityRatesBE.MinNbrOfHours)
这意味着后端返回的JSON是类似"12"或者12这样的单个值,而不是一个包含MinNbrOfHours键的对象(比如{"MinNbrOfHours":12})。
但在前端的success回调里,你试图把返回值当作对象来访问属性:
var obj = response.d; alert('Field: ' + obj.MinNbrOfHours);
这里的obj其实就是那个单个数值,自然没有MinNbrOfHours这个属性,所以你拿不到想要的值。
两种解决方案
方案1:修改后端,返回带键的对象(推荐)
把后端的返回逻辑改成返回一个包含目标属性的匿名对象,这样序列化后就是符合前端预期的键值对JSON:
<System.Web.Services.WebMethod()> <ScriptMethod(UseHttpGet:=True, ResponseFormat:=ResponseFormat.Json)> Public Shared Function GetMinimumDaysInAdvance(ByVal intOrganizationKey As Int32, ByVal intFacilitySpaceKey As Integer) As Object Dim FacilityRatesBE As New FacilityRatesBE Dim FacilityRatesDAL As New FacilityDAL FacilityRatesBE = FacilityRatesDAL.GetFacilityRatesByFacilityKey(intOrganizationKey, intFacilitySpaceKey) ' 返回包含属性的匿名对象,而非单个数值 Return New With { .MinNbrOfHours = FacilityRatesBE.MinNbrOfHours } End Function
这样后端返回的JSON会是{"MinNbrOfHours":X},前端原有的obj.MinNbrOfHours就能正常获取到值了,同时你也可以保留原来的赋值逻辑:
$("#hdnMinimumDaysInAdvance").val(obj.MinNbrOfHours);
方案2:修改前端,直接使用返回的数值
如果不想改动后端,那直接使用obj本身即可,因为它就是你要的MinNbrOfHours的值:
success: function (response) { var minHours = response.d; alert('Field: ' + minHours); $("#hdnMinimumDaysInAdvance").val(minHours); },
调试小技巧
以后遇到类似的JSON解析问题,可以在success回调里先打印返回值看看实际结构:
console.log(response.d);
通过浏览器的开发者工具查看控制台输出,就能直观看到返回的是单个值还是对象,快速定位问题。
内容的提问来源于stack exchange,提问作者Susan
相关产品推荐
相关产品推荐

