如何将此Json数组转换为JQuery可读的格式?

时间:2012-08-12 15:18:21

标签: javascript jquery ajax json asp.net-mvc-3

有点模糊的问题,但我不确定如何才能使用它。 Firebug说我的ajax请求中的Json对象(数组?)看起来像:

{
"jsonResult":
"[
   {\"OrderInList\":1},
   {\"OrderInList\":2}
]"
}

这是通过$ .getJSON ajax请求检索的:

    $.getJSON("/Json/GetOrderSelectList?parentCategoryId=" + postData, testData, function (jsonResult) {
        $('#orderInList option').remove();

        var map = {
            "TestKey1": "TestValue1",
            "TestKey2": "TestValue2"
        };

        $.each(jsonResult, function (key, value) {
            $("#orderInList").append($("<option value=" + key + ">" + value + "</option>")
            );
        });

如果我用$ .each(map)替换$ .each(jsonResult),则选择列表会正确填充。否则,我的选择列表只是说'未定义&#39;。

我在我的MVC控制器中序列化了这个Action中的Json:

    public JsonResult GetOrderSelectList(int parentCategoryId)
    {
        var result = Session
            .QueryOver<Category>()
            .Where(x => x.Parent.Id == parentCategoryId)
            .OrderBy(x => x.OrderInList).Asc
           .List();

        var toSerialize =
            result.Select(r => new {r.OrderInList});

        var jsonResult = JsonConvert.SerializeObject(toSerialize);                             
        return Json(new
                        { jsonResult,
                        }, JsonRequestBehavior.AllowGet);

    }

所以我认为问题可能是Action响应的Json格式?任何帮助表示赞赏!

编辑回答

以下两个答案对我有帮助。我似乎无法强力键入变量jsonResult,所以感谢@JBabey在读取json属性时指出我的错误,并在$ .each语句中建议函数(键,值)。

感谢@Darin Dimitrov协助我的控制器排序!

2 个答案:

答案 0 :(得分:3)

您的控制器操作错误。您在其中手动进行JSON序列化,然后将其作为JSON结果返回,从而以双JSON序列化结束。您可以直接返回数组并将JSON序列化管道留给ASP.NET MVC框架:

public ActionResult GetOrderSelectList(int parentCategoryId)
{
    var result = Session
        .QueryOver<Category>()
        .Where(x => x.Parent.Id == parentCategoryId)
        .OrderBy(x => x.OrderInList)
        .Asc
        .List();
    return Json(result, JsonRequestBehavior.AllowGet);
}

然后:

$.getJSON("/Json/GetOrderSelectList?parentCategoryId=" + postData, testData, function (jsonResult) {
    $('#orderInList option').remove();
    $.each(jsonResult, function () {
        $('#orderInList').append(
            $("<option value=" + this.Id + ">" + this.Value + "</option>")
        );
    });
});

请注意,我在此处使用this.Idthis.Value。这假设JSON结果如下所示:

[{"Id": 1, "Value": "some value"}, {"Id": 2, "Value": "some other value"}]

您必须根据实际的Category模型调整这些属性名称。

答案 1 :(得分:1)

您将ajax返回的数据属性与数据本身混淆。如果你纠正这个问题,$.each会正常工作。

您返回的数据如下所示:

{
    "jsonResult": "[
        {\"OrderInList\":1},
        {\"OrderInList\":2}
    ]"
}

这意味着这是传递给您的成功函数的对象。称之为data而不是jsonResult

function (data) {
    ...
    $.each(data.jsonResult, function (key, value) {
        ...
    });
});

此外,您的数组是以字符串形式出现的,因此您可能需要在$.each能够迭代它之前对其进行解析。