我花了太多时间试图找出如何使用JS和JSON从我的C#应用程序中提取所需的所有值。当我只使用简单的结构(例如数组)时,它工作正常,但我需要能够在运行时增长列表。
现在,我能想到的最好的方法是使用递增的键值执行Dictionary,将其他3个值作为类对象。但是,这似乎使我的C#应用程序崩溃了。
最好的方法是什么?
相关的C#代码:
public class ChatData
{
string userName;
string message;
System.DateTime timestamp;
public ChatData(string name, string msg)
{
userName = name;
message = msg;
timestamp = System.DateTime.Now;
}
}
else if (string.Equals(request, "getchat"))
{
//string since = Request.Query.since;
Dictionary<int, ChatData> data = new Dictionary<int, ChatData>();
data.Add(1, new ChatData("bob", "hey guys"));
data.Add(2, new ChatData("david", "hey you"));
data.Add(3, new ChatData("jill", "wait what"));
return Response.AsJson(data);
}
相关的Javascript:
function getChatData()
{
$.getJSON(dataSource + "?req=getchat", "", function (data)
{
//$.each(data, function(key, val)
//{
//addChatEntry(key, val);
//})
});
}
答案 0 :(得分:3)
您尚未解释Response.AsJson
是什么以及如何实施,但如果它使用JavaScriptSerializer
,您将获得以下异常:
未处理的异常:System.ArgumentException:Type “System.Collections.Generic。字典`2 [[System.Int32,mscorlib, 版本= 4.0.0.0,文化=中立, PublicKeyToken = b77a5c561934e089],[ChatData,Test,Version = 1.0.0.0, 不支持Culture = neutral,PublicKeyToken = null]]' 字典的序列化/反序列化,键必须是字符串或 对象。
这是非常不言自明的。如果您打算将JSON序列化此结构,则不能将整数用作键。另外,因为你的ChatData
类不再具有默认/无参数构造函数,所以你将无法将JSON字符串反序列化回这个类(但我想你还不需要它)。
因此,您的问题的一个可能解决方案是使用:
Dictionary<string, ChatData> data = new Dictionary<string, ChatData>();
data.Add("1", new ChatData("bob", "hey guys"));
data.Add("2", new ChatData("david", "hey you"));
data.Add("3", new ChatData("jill", "wait what"));
现在当然是这样说并且看着你注释掉的javascript以及你打算做什么,正如我已经在你的previous question中解释的那样,词典没有被序列化为javascript数组,所以你不能循环它们。
长话短说,定义一个类:
public class ChatData
{
public string Username { get; set; }
public string Message { get; set; }
public DateTime TimeStamp { get; set; }
}
然后填写此类的数组:
var data = new[]
{
new ChatData { Username = "bob", Message = "hey guys" },
new ChatData { Username = "david", Message = "hey you" },
new ChatData { Username = "jill", Message = "wait what" },
};
return Response.AsJson(data);
最后消费:
$.getJSON(dataSource, { req: 'getchat' }, function (data) {
$.each(data, function(index, element) {
// do something with element.Username and element.Message here, like
$('body').append(
$('<div/>', {
html: 'user: ' + element.Username + ', message:' + element.Message
})
);
});
});
答案 1 :(得分:2)
为什么不简单地使用打字列表?此外,您还需要一个默认构造函数来序列化/反序列化它。请注意我是如何修改您的类以使用属性的 同样。请注意,正如@rudolf_franek所提到的,如果您需要能够链接到它,可以向ChatData类添加ID属性。
public class ChatData
{
public ChatData()
{
TimeStamp = DateTime.Now;
}
public int ID { get; set; }
public string Who { get; set; }
public string Said { get; set; }
public DateTime TimeStamp { get; set; }
}
...
var data = new List<ChatData>
{
new ChatData { ID = 1, Who = "bob", Said = "hey guys" },
...
};
return Response.AsJson( data );