如何将JSON数组转换为JavaScript数组?

如何将JSON数组转换为JavaScript数组?,json,knockout.js,Json,Knockout.js,我使用KnockoutJS进行数据绑定。 以下代码是控制器的操作方法 public JsonResult GetPeople() { var people = new List<Person> { new Person {Name = "aaaa", Address = "aaaaaaaaa"}, new Person {Name =

我使用KnockoutJS进行数据绑定。 以下代码是控制器的操作方法

public JsonResult GetPeople()
{
    var people = new List<Person>
                     {
                         new Person {Name = "aaaa", Address = "aaaaaaaaa"},
                         new Person {Name = "bbbb", Address = "bbbbbbbbb"},
                         new Person {Name = "cccc", Address = "ccccccccc"}
                     };
    return Json(people, JsonRequestBehavior.AllowGet);
}
publicjsonresult GetPeople()
{
var people=新列表
{
新人{Name=“aaaa”,Address=“aaaaaaaaaaaa”},
新人{Name=“bbbb”,Address=“bbbbb”},
新人{Name=“cccc”,Address=“ccccccc”}
};
返回Json(people,JsonRequestBehavior.AllowGet);
}
下面是客户端代码的片段

<ul data-bind="foreach: people">
  <li>NAME:<span data-bind="text: Name"></span></li>
  <li>ADDRESS:<span data-bind="text: Address"></span></li>  
</ul>

<script>
    function getPeopleFromServer() {
        var people= [];

        $.ajax({
            url: "GetPeople",
            cache: false,
            type: "GET",
            success: function (result) {
                console.log("result= " + result);
                people = $.parseJSON(result);
                console.log("people= " + people);
            }
        });

        return people;
    }

    function ViewModel() {
        var self = this;

        // data
        self.people = ko.observableArray(getPeopleFromServer());        
    }

    ko.applyBindings(new ViewModel());
</script>
  • 姓名:
  • 地址:
函数getPeopleFromServer(){ var people=[]; $.ajax({ 网址:“GetPeople”, cache:false, 键入:“获取”, 成功:功能(结果){ console.log(“result=“+result”); people=$.parseJSON(结果); console.log(“people=“+people”); } }); 还人,; } 函数ViewModel(){ var self=这个; //资料 self.people=ko.observearray(getPeopleFromServer()); } 应用绑定(新的ViewModel());
问题是getPeopleFromServer方法中的people变量始终为null,而结果具有来自服务器的正确值。
我遗漏了什么吗?

您的
$。ajax
函数比其包含函数花费的时间更长,因此包含函数在执行结束时不会弹出
人员

您可以做的一件事是将以下内容添加到
$.ajax

$.ajax({
   async: false,
   url: "GetPeople",
   .....
});

async:false
将使包含函数“等待”直到ajax完成。您的人员变量应该在函数执行结束时填充。虽然这是一个快速的胜利,但我同意您应该重新思考ViewModel的处理方式。

应该在同一视图模型中提及任何人。或者作为自我的人。我建议您将对ajax的调用放在视图模型中,这样就很清楚了。 因此getPeopleFromServer()应该在viewmodel中

出于兴趣,您还可以添加
超时:600000以便调用不会超时。

尝试使用ko.mapping插件

function ViewModelWrapper(jsonResult)
{
       var self = this;
       self.model = ko.mapping.fromJS(jsonResult);
}

@汤姆的评论是正确的


“success”是一个内联异步函数。基本上,“return people”发生在调用“success”函数之前,因为ajax调用是非阻塞的。您需要重新设计ViewModel以异步工作(或关闭异步),希望其他人也会加入代码修复

这是他预言的完整的小提琴


您从console.log(“result=“+result”)中得到了什么;您是否检查过jQuery是否将结果解析为JSON?您可以删除
$.parseJSON
,看看事情是否开始运行…“success”是一个内联异步函数。基本上,“return people”发生在调用“success”函数之前,因为ajax调用是非阻塞的。您需要重新设计ViewModel以异步工作(或关闭异步),希望其他人会加入代码修复我有这样的日志“result=[object object],[object object],[object object]people=null”@Tom关于重新设计ViewModel,我想要的是将服务器调用方法与ViewModel分开。你对此有什么想法吗?谢谢你的回复,Martin,我添加了“async:false”,但是people仍然是null,而result不是null。