繁体   English   中英

对象字典不能用作JSON

[英]Dictionary of Objects doesn't work as JSON

我花了太多时间试图找出如何使用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);
        //})
    });
}

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

未处理的异常:System.ArgumentException:键入'System.Collections.Generic。 字典`2 [[System.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral,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以及你打算做什么,正如我在前一个问题中已经解释过的那样 ,字典没有被序列化为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
            })
        );
    });
});

为什么不简单地使用打字列表? 此外,您还需要一个默认构造函数来序列化/反序列化它。 请注意我是如何修改您的类以使用属性的。 请注意,正如@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 );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM