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; }
}
从描述中,听起来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数组
根据您问题中的示例,Animations
和Frames
是数组-但您将它们视为对象。
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之类的东西,它更适合编写算法代码,就像你在游戏....中所编写的那样类的功能也特别可爱!