使用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}