C# 对象字典不';不能像JSON那样工作

C# 对象字典不';不能像JSON那样工作,c#,javascript,json,object,dictionary,C#,Javascript,Json,Object,Dictionary,我花了太多时间试图弄清楚如何使用JS和JSON从我的C#应用程序中提取所有需要的值。当我只使用简单的结构(如数组)时,它工作得很好,但我需要能够在运行时扩展列表 现在,我所能想到的最好的方法是使用递增的键值编写一个字典,其他3个值作为类对象。然而,这似乎使我的C#应用程序崩溃了 最好的方法是什么 相关C#代码: 您没有解释什么是Response.AsJson以及它是如何实现的,但是如果它使用JavaScriptSerializer,您将得到以下异常: 未处理的异常:System.Argument

我花了太多时间试图弄清楚如何使用JS和JSON从我的C#应用程序中提取所有需要的值。当我只使用简单的结构(如数组)时,它工作得很好,但我需要能够在运行时扩展列表

现在,我所能想到的最好的方法是使用递增的键值编写一个字典,其他3个值作为类对象。然而,这似乎使我的C#应用程序崩溃了

最好的方法是什么

相关C#代码:


您没有解释什么是
Response.AsJson
以及它是如何实现的,但是如果它使用
JavaScriptSerializer
,您将得到以下异常:

未处理的异常:System.ArgumentException:类型 'System.Collections.Generic。字典'2[[System.Int32,mscorlib, 版本=4.0.0.0,区域性=中性, PublicKeyToken=b77a5c561934e089],[ChatData,测试,版本=1.0.0.0, 不支持区域性=中性,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"));
然后填充此类的数组:

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
            })
        );
    });
});
$.getJSON(数据源,{req:'getchat'},函数(数据){
$.each(数据、函数(索引、元素){
//在这里对element.Username和element.Message执行一些操作,比如
$('body')。追加(
$('', {
html:'用户:'+element.Username+',消息:'+element.message
})
);
});
});

为什么不简单地使用键入的列表?此外,还需要一个默认构造函数来序列化/反序列化它。注意我是如何修改您的类以使用属性的 也注意,@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 );
公共类聊天室数据
{
公共数据()
{
TimeStamp=DateTime.Now;
}
公共int ID{get;set;}
公共字符串Who{get;set;}
公共字符串表示{get;set;}
公共日期时间时间戳{get;set;}
}
...
var数据=新列表
{
新聊天数据{ID=1,Who=“bob”,Said=“嘿伙计们”},
...
};
返回Response.AsJson(数据);

你会遇到什么例外?我同意-如果你能避免的话,为什么要“弯曲”字典来序列化它?(可选)ChatItem可以有一个名为ID的附加属性来替换原始字典中的int键,因此可以在搜索请求中使用它。很好,我在头脑中已经把它复杂化了,就像我通常做的那样。谢谢你这么简单的方法让我使用!但我遇到的主要问题是,我无法确定要使用哪种存储类型,因为我需要能够在运行时添加到其中。不过,现在为我的对象使用列表非常有效,但感谢您的大力帮助!
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
            })
        );
    });
});
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 );