C#列表>;JSON>;Javascript

C#列表>;JSON>;Javascript,c#,javascript,json,C#,Javascript,Json,我正在ASP.NETMVC网站上对控制器方法进行AJAX调用。该方法正在发回一些自定义对象 我很难将这些C#对象中的列表作为Javascript数组处理,而且我对Javascript还不够了解,不知道问题出在哪里 我有一个叫做动画的对象。每个动画都有一个名为“帧”的列表。如果我尝试将JSONized帧(例如currentAnimation.Frames)传递给一个Javascript方法,该方法需要一个整数数组,那么我不会得到一个异常,但是接收方法没有得到它期望的整数数组,因此它也不会对数据做任

我正在ASP.NETMVC网站上对控制器方法进行AJAX调用。该方法正在发回一些自定义对象

我很难将这些C#对象中的列表作为Javascript数组处理,而且我对Javascript还不够了解,不知道问题出在哪里

我有一个叫做动画的对象。每个动画都有一个名为“帧”的列表。如果我尝试将JSONized帧(例如currentAnimation.Frames)传递给一个Javascript方法,该方法需要一个整数数组,那么我不会得到一个异常,但是接收方法没有得到它期望的整数数组,因此它也不会对数据做任何处理

这是我的Javascript。请注意,它将“this.spriteSheet.Animations[sheet].Frames”传递给“addAnim”方法。这不管用

for (var sheet in this.spriteSheet.Animations) {

    var animation = this.addAnim(this.spriteSheet.Animations[sheet].Name, this.spriteSheet.Animations[sheet].Speed, this.spriteSheet.Animations[sheet].Frames);

    if (this.flip) {
        animation.flip.x = true; ;
    }
}
下面是一些我修改后可以使用的Javascript(虽然我不知道这是否是最好的解决方案,也不知道问题出在哪里):

以下是我的控制器操作代码:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult GetPlay(int id)
{
    // get the game that has been requested
    Cherub.Common.Logic.Game game = new Common.Logic.Game();

    // get the play data
    Play play = game.GetPlay(id);

    return Json(play, JsonRequestBehavior.AllowGet);
}
我使用JQuery的ajax调用调用控制器操作:

$.ajax({
        type: "GET",
        url: ajaxUrl,
        contentType: "application/json; charset=utf-8",
        data: {},
        dataType: "json",
        success: functionSuccess,
        error: functionFailure,
        cache: false
    });
下面是从控制器操作返回的JSON的一小部分:

"Animations":[{"Name":"bob","Frames":[0,1,2],"Speed":0.2}]
这是我的精神片课

public class SpriteSheet
{
    public SpriteSheet(string name)
    {
        Animations = new List<Animation>();

        switch(name.ToLower())
        {
            case "sylph":
                Sheet = "media/Sylph.png";
                Animations.Add(new Animation { Name = "bob", Frames = new List<int> { 0, 1, 2 }, Speed = .2f });
                FrameSize = new Vector2D { X = 94, Y = 125 };
                break;
        }
    }

    public string Sheet { get; set; }
    public List<Animation> Animations { get; set; }
    public Vector2D FrameSize { get; set; }
}

public class Animation
{
    public string Name { get; set; }
    public List<int> Frames { get; set; }
    public float Speed { get; set; }
}
公共类精灵表
{
公共精灵表(字符串名称)
{
动画=新列表();
开关(名称.ToLower())
{
“精灵”一案:
Sheet=“media/Sylph.png”;
添加(新动画{Name=“bob”,帧=新列表{0,1,2},速度=.2f});
FrameSize=newvector2d{X=94,Y=125};
打破
}
}
公共字符串表{get;set;}
公共列表动画{get;set;}
公共向量2D帧大小{get;set;}
}
公共类动画
{
公共字符串名称{get;set;}
公共列表帧{get;set;}
公共浮点速度{get;set;}
}

从描述中,听起来像是帧正在被转换成这样的东西:

{0: 1, 1: 2, 2: 3}
[1, 2, 3]
。。。而你想要的东西更像这样:

{0: 1, 1: 2, 2: 3}
[1, 2, 3]
这两个javascript对象都可以这样访问:
obj[0]
,但只有后者是实际的数组。对前者执行
循环将产生[0,1,2],而对后者执行
循环将产生[1,2,3]

如果我是对的,那么您需要查看用于将
Frames
序列化为JSON字符串的代码,并使其将
Frames
视为类似数组的对象

更新
嗯,我被难倒了。一切看起来都应该正常工作,以使
成为javascript中的数组。

根据您问题中的示例,
动画
都是数组,但您将它们视为对象

for..in
循环对于迭代对象的属性很有用,但是您需要使用简单的
for
循环遍历数组中的每个元素

如果您更改了..的
。。在
循环中,您应该得到您想要的结果:

var anims = spriteSheet.SpriteSheet.Animations;

for(i = 0; i < anims.length; i++) {

    var frames = new Array();
    for(j = 0; j < anims[i].Frames.length; j++) {

        frames[i] = anims[i].Frames[j];

        ...
var anims=spriteSheet.spriteSheet.Animations;
对于(i=0;i
我的建议是不要在
循环中为…使用
。
我以前遇到过跨浏览器的“奇怪”问题,但似乎没有什么意义,所有的JS专家都建议只使用常规的迭代for循环


如果您试图将JS简化为更易于管理的内容,那么我会彻底建议您使用更适合于编写算法代码的内容,就像您在游戏中所做的那样……类功能也特别好!

您可以使用Firebug检查控制器操作的JSON结果吗那么,你的C#对象中的
Frames
是什么类型的呢?Frames是一个列表。我使用chrome的调试器检查了这个变量。它说它是一个对象。length属性不像你在数组中所期望的那样存在,但是你可以索引到它中,得到Frames[0]这样的值。您可以索引到javascript中的任何对象,它将为您提供该对象的属性。例如,
{a:1,b:2,c:3}
,当你迭代这个对象时,你会得到
a
b
,和
c
。这就是为什么我有兴趣看到实际生成的JSON字符串。另外,你是如何生成这个JSON的?你能显示MVC操作的代码吗?好的,这是有意义的。我用Javascript代码更新了帖子,我用它来调用controller方法以及controller方法本身。我不确定如何获取JSON,我也对它感兴趣。我没有安装firebug,因为我对chrome的调试器有着更好的体验。你知道我如何在chrome调试器中为你获取这些信息吗?不管怎样,我有一个非常简单的方法来访问它他是我没有想到的JSON。大量的JSON回来了,所以我只复制了带有动画的部分。我希望这会有所帮助。两个数据结构上的
for
循环将产生0、1、2。只有对象属性的顺序是不保证的。@Felix:True。感谢您捕捉到这一点。动画没有长度属性(问题的一部分)这就是为什么我在语法中使用for…。如果它是一个数组,它应该有一个长度-你确定它的形式是:“Animations”:[{…},{…}]。你能发布一个spriteSheet对象的示例,这样我们可以看到一些上下文吗?我更新了原始帖子,以包含spriteSheet类,我确信这就是JSON。我直接点击控制器操作,复制并粘贴了它。我已经模拟了基于你的控制器@omatase,我希望你的JSON看起来像什么。你能吗u确认您从服务接收的数据结构是否与我导出的结构匹配?是的,我可以确认