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"}