2013-08-26 53 views
0

目前我有一个AJAX请求,它将运行以下SQL语句。将JSON解析为对象的数组属性

select top 1  
     DrugQuestionId 
     ,DrugId 
     ,DrugQuestion as DrugQuizquestion 
     ,CorrectAnswer 
     ,QuizQuestionTypeId 
from DrugQuestions 

并返回一个drugQuestion对象,具有SQL Server表中列出的属性。

相关JS:

$(document).ready(function() 
     { 
      $('#btnSubmit').click(function() 
      { 
       $.ajax(
       { 
        type: "POST", 
        url: "GetDrugQuiz.asmx/GenerateDrugQuestion", 
        contentType: "application/json; charset=utf-8", 
        dataType: "json", 
        success: function (data) 
        { 
         var drugQuestion = $.parseJSON(data.d); 
         //everything prints to the console correctly 
         console.log(drugQuestion.DrugQuestionId); //5 in this example 
         console.log(drugQuestion.DrugId); 
         console.log(drugQuestion.DrugQuizQuestion); 
         console.log(drugQuestion.CorrectAnswer); 
         console.log(drugQuestion.QuizQuestionTypeId); 


        }, 
        error: function (xhr) 
        { 
         alert(xhr.status); 
        } 

       }); 
      }); 
     }); 

这工作得很好,给我我一直在寻找的答案。在实践中,我需要一个drugQuiz对象,该对象具有属于drugQuestion对象数组的属性。我使用以下WebMethod尝试:

//this is questions, plural mean to populate an array with a length equal to the row count 
//of the query 
    public string GenerateDrugQuestions() 
      { 
       var jss = new JavaScriptSerializer(); 
       DrugQuiz qz = new DrugQuiz(); 
       qz.PatientId = 123; 
       qz.DateTaken = DateTime.Now; 
       qz.DrugQuizId = 1; 
       string cs = ConfigurationManager.ConnectionStrings["dbcs"].ConnectionString; 
       using (var con = new SqlConnection(cs)) 
       { 
        using (var cmd = new SqlCommand("select top 3 * from DrugQuestions", con)) 
        { 
         con.Open(); 

         SqlDataReader rdr = cmd.ExecuteReader(); 
         while (rdr.Read()) 
         { 
          DrugQuestion dq = new DrugQuestion(); 
          dq.DrugQuestionId = (int)rdr["DrugQuestionId"]; 
          dq.DrugId = (int)rdr["DrugId"]; 
          dq.DrugQuizQuestion = rdr["DrugQuestion"].ToString(); 
          dq.CorrectAnswer = rdr["CorrectAnswer"].ToString(); 
          dq.QuizQuestionTypeId = (int)rdr["QuizQuestionTypeId"]; 
          qz.DrugQuestions.Add(dq); 
         } 
         return jss.Serialize(qz); 
        } 
       } 
      } 

因此,您可以看到JSON字符串正在从WebMethod返回。当我使用WebMethod而没有实际访问页面并点击Invoke时,我得到正确的字符串。我无法弄清楚如何填充drugQuestions的数组,这是drugQuiz对象的属性。我需要更改下面的代码以允许发生这种情况?

$(document).ready(function() 
     { 
      var drugQuiz = {}; 
      drugQuiz.drugQuestions = new Array(); 
      $('#btnSubmit').click(function() 
      { 
       $.ajax(
       { 
        type: "POST", 
        url: "GetDrugQuiz.asmx/GenerateDrugQuestions", 
        contentType: "application/json; charset=utf-8", 
        dataType: "json", 
        success: function (data) 
        { 
         drugQuiz.drugQuestions.push($.parseJSON(data.d)); 
         console.log(drugQuiz.drugQuestions.length); 
         console.log(drugQuiz.drugQuestions); 

        }, 
        error: function (xhr) 
        { 
         alert(xhr.status); 
        } 

       }); 
      }); 
     }); 

我需要能够做类似alert(drugQuiz.drugQuestions [0] .DrugId);

回答

3

遍历返回的JSON和推动各项目到JavaScript数组,像这样:

success: function (data) { 
    $.each(data.d, function(i, item) { 
     drugQuiz.drugQuestions.push(item); 
    }); 
}, 

如果你想与parseJSON()要做到这一点,那么试试这个:

success: function (data) { 
    var jsonData = JSON.parse(data.d); 
    for (var i in jsonData.drugQuestions) { 
     var question = jsonData.drugQuestions[i]; 
    } 
}, 

注意:我不确定你的JSON对象的名字,我猜drugQuestionsdrugQuestion对象数组的名字,如果不是,那么改变jsonData.的值来匹配你的JSON结构转身。

+0

这样做可以不使用'each'(只是为了好奇)。当我使用'var string = $ .parseJSON(data.d)'查看控制台中的内容时,它看起来像里面有所有数据,但如果我尝试使用索引器访问属性,它是未定义的。 – wootscootinboogie

+0

是的,但我发现'.each()'语法更清晰,但是说这个问题已经更新以显示'.parseJSON()'语法。 –