使用JSON.NET反序列化字典

我正在使用版本4.0.8的Newtonsoft.Json并尝试将其与Web API一起使用。 所以我想用JST反序列化JSON

JsonConvert.DeserializeObject(jsonString); 

这有效,直到我将Dictionary作为属性添加到此类并想要反序列化它。

json字符串的forms为

 { "Date":null, "AString":"message", "Attributes":[ {"Key":"key1","Value":"value1"}, {"Key":"key2","Value":"value2"} ], "Id":0, "Description":"... } 

当反序列JsonSerializationException JsonSerializationException类型的exception时会JsonSerializationException以下消息:“ 无法将JSON数组反序列化为类型’System.Collections.Generic.Dictionary`2 [System.String,System.String]’。

我在这做错了什么?

UPDATE1:使用JSON.NET进行序列化时,我得到以下字典:

 Attributes":{"key1":"value1","key2":"value2"} 

似乎WebApi以不同于Json.Net的方式反序列化对象。 服务器端我使用以下行进行隐式反序列化:

 return new HttpResponseMessage(object); 

UPDATE2:作为一种解决方法,我现在来到了服务器端。

 return new HttpResponseMessage(JsonConvert.SerializeObject(license).Base64Encode()); 

我用Json.Net服务器端转换它并将其作为base64编码的字符串传输。 所以Json.Net可以反序化自己的格式。

但它仍然不是我想要的,那么还有什么进一步的建议吗?

如果将Attributes声明为List>它应该有效

从这篇post中 ,打电话

 JsonConvert.SerializeObject(yourObject, new KeyValuePairConverter()); 

以Web API为您创建的格式获取JSON。

因此,人们可能会认为是在呼唤

 JsonConvert.DeserializeObject(jsonString, new KeyValuePairConverter()); 

将反过来并正确处理Web API的风格。

不过,我不知道这种过载是否存在; 尝试一下,看看会发生什么……

 Dictionary result = JsonConvert.DeserializeObject>(strJsonResult); 

如果是.NET 4,则可以使用DataContract属性和DataContractJsonSerializer类来强制执行消息格式:

  [DataContract] public class Message { [DataMember] public DateTime? Date { get; set; } [DataMember] public string AString { get; set; } [DataMember] public Dictionary Attributes { get; set; } [DataMember] public int Id { get; set; } [DataMember] public string Description { get; set; } } DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Message)); Message message = null; using (MemoryStream jsonStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString))) { // Deserialize message = (Message)jsonSerializer.ReadObject(jsonStream); // Go to the beginning and discard the current stream contents. jsonStream.Seek(0, SeekOrigin.Begin); jsonStream.SetLength(0); // Serialize jsonSerializer.WriteObject(jsonStream, message); jsonString = Encoding.UTF8.GetString(jsonStream.ToArray()); } 

将其序列化后退将生成以下JSON:

 {"AString":"message","Attributes":[{"Key":"key1","Value":"value1"},{"Key":"key2","Value":"value2"}],"Date":null,"Description":"...","Id":0}