C# List > JSON > Javascript

本文关键字:gt Javascript JSON List | 更新日期: 2023-09-27 18:03:39

我正在做一个AJAX调用控制器方法在我的ASP。Net MVC网站。这个方法返回一些自定义对象JSONized。

我有麻烦处理列表从这些c#对象作为Javascript数组,我只是新的Javascript不足以理解问题是什么。

我有一个对象叫做Animations。每个动画都有一个名为Frames的列表。如果我尝试传递JSONized帧,例如currentAnimation。框架到一个Javascript方法期望一个整数数组,我没有得到一个异常,但接收方法没有得到一个整数数组,像它期望的,所以它也不做任何与数据。

这是我的Javascript。注意它传递了"this.spriteSheet.Animations[sheet]"。Frames"添加到"addanimm"方法。这行不通。

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我修改工作(虽然我不知道它是否是最好的解决方案,我仍然不知道问题是什么):

for (var sheet in this.spriteSheet.Animations) {
        var frames = new Array();
        for (var frame in this.spriteSheet.Animations[sheet].Frames) {
            frames[frame] = this.spriteSheet.Animations[sheet].Frames[frame];
        }
    var animation = this.addAnim(this.spriteSheet.Animations[sheet].Name, this.spriteSheet.Animations[sheet].Speed, frames);
    if (this.flip) {
        animation.flip.x = true; ;
    }
}

这是我的控制器动作代码:

[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}]
这是我的SpriteSheet类
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; }
}

C# List > JSON > Javascript

从描述中,听起来Frames正在被转换成这样的内容:

{0: 1, 1: 2, 2: 3}

…而你想要更像这样的东西:

[1, 2, 3]

这两个javascript对象都可以像这样访问:obj[0],但只有后者是一个实际的数组。在前者上做一个for环将得到[0,1,2],而在后者上做一个for环将得到[1,2,3]。

如果我是对的,那么你需要看看你用来将Frames序列化成JSON字符串的代码,并使它将Frames视为一个类似数组的对象。

更新

好吧,我被难住了。一切看起来应该是正确的工作,使Frames在javascript数组

根据您问题中的示例,AnimationsFrames是数组-但您将它们视为对象。

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

如果你改变你的for .. in循环,你应该得到你正在寻找的结果:

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];
        ...

我的建议是使用for...in循环。我之前遇到过跨浏览器的"奇怪"问题,这似乎没有意义,所有的JS大师都建议使用常规迭代的for循环

如果你想把JS精简成更易于管理的东西,那么我强烈建议你使用Coffee Script之类的东西,它更适合编写算法代码,就像你在游戏....中所编写的那样类的功能也特别可爱!