C# 如何使用DataContractJsonSerializer反序列化字典?

C# 如何使用DataContractJsonSerializer反序列化字典?,c#,.net,json,deserialization,C#,.net,Json,Deserialization,我有以下型号: [DataContract] public class MessageHeader { private Guid? messageId; public Guid MessageId { get { if (messageId == null) messageId = Guid.NewGuid(); return messageId.Value

我有以下型号:

[DataContract]
public class MessageHeader
{
    private Guid? messageId;

    public Guid MessageId
    {
        get
        {
            if (messageId == null)
                messageId = Guid.NewGuid();

            return messageId.Value;
        }
    }

    [DataMember]
    public string ObjectName { get; set; }

    [DataMember]
    public Dictionary<string, object> Parameters { get; set; } // Can't deserialize this

    [DataMember]
    public Action Action { get; set; }

    [DataMember]
    public User InitiatingUser { get; set; }
}
[DataContract]
公共类消息头
{
私有Guid?消息ID;
公共Guid消息ID
{
得到
{
if(messageId==null)
messageId=Guid.NewGuid();
返回messageId.Value;
}
}
[数据成员]
公共字符串ObjectName{get;set;}
[数据成员]
公共字典参数{get;set;}//无法对此进行反序列化
[数据成员]
公共操作动作{get;set;}
[数据成员]
公共用户InitiatingUser{get;set;}
}
现在由于一些未知原因,(请参阅其他详细信息部分)。
不幸的是,由于我无法理解的原因,DataContractJsonSerializer也被封存。

我需要一种绕过它的方法,有人知道吗?

因为javascript中没有字典类型,所以很难将JSON分解成一种。你要做的就是自己写一个转换器

然而,在大多数自定义序列化对象上也是如此,所以希望这不会让人大吃一惊

不过,现在它应该作为KeyValuePair读入,这样您就可以尝试,看看它是否至少对您进行了反序列化。相反,您需要一个
列表

字典
对JSON的翻译:

var dict = new Dictionary<string,string>; 
dict["Red"] = "Rosso"; 
dict["Blue"] = "Blu"; 
dict["Green"] = "Verde";

[{"Key":"Red","Value":"Rosso"},
 {"Key":"Blue","Value":"Blu"},
 {"Key":"Green","Value":"Verde"}]
简而言之,这就是问题所在


一些有用的后续链接


为什么DataContractJsonSerializer不能将字典序列化为:dictionary[“ObjectName”]=Value;此外,CollectionDataContractAttribute也不适用于DataContractJsonSerializer,这也是毫无原因的。关于第一个链接,如果我没有JavaScriptSerializer,我该怎么办,因为它是一个Web DLL?我不明白?只需引用.NET GAC中的任何库,就可以使用它。这就是.NET库的强大功能。仅仅因为它在System.Web或其他任何东西中,这并不意味着什么。它只是对象、方法等的逻辑组织的名称空间。至于为什么DCJS不能以这种方式序列化字典,idk,但我已经向您展示了上面的问题。我已经做了更多的调查,JSON.NET似乎完全符合我对字典的要求,这实际上表明了这种序列化的实现有多糟糕。谢谢。@drachenstern:第一个链接方法的问题是它没有反序列化对象中的字典。
var a = {}; 
a["Red"] = "Rosso"; 
a["Blue"] = "Blu"; 
a["Green"] = "Verde";

{"Red":"Rosso","Blue":"Blu","Green":"Verde"}