目前我有一个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);
这样做可以不使用'each'(只是为了好奇)。当我使用'var string = $ .parseJSON(data.d)'查看控制台中的内容时,它看起来像里面有所有数据,但如果我尝试使用索引器访问属性,它是未定义的。 – wootscootinboogie
是的,但我发现'.each()'语法更清晰,但是说这个问题已经更新以显示'.parseJSON()'语法。 –