![](/img/trans.png)
[英]Json.Net Is it faster to deserialize to JObject or Dictionary?
[英]Deserialize Dictionary with JSON.NET
我在版本4.0.8中使用Newtonsoft.Json,并尝试将其与Web API一起使用。 所以我想用反序列化JSON
JsonConvert.DeserializeObject<AClass>(jsonString);
在我将Dictionary作为属性添加到此类并想反序列化之前,此方法一直有效。
json字符串的形式为
{
"Date":null,
"AString":"message",
"Attributes":[
{"Key":"key1","Value":"value1"},
{"Key":"key2","Value":"value2"}
],
"Id":0,
"Description":"...
}
当发生反序列化类型为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<AClass>(object);
UPDATE2:作为一种解决方法,我现在来到下面的线路服务器端。
return new HttpResponseMessage<string>(JsonConvert.SerializeObject(license).Base64Encode());
我将其与Json.Net服务器端进行转换,并将其作为base64编码的字符串进行传输。 因此,Json.Net可以反序列化其自己的格式。
但是它仍然不是我想要的,理论上有什么进一步的建议吗?
如果您将Attributes
声明为List<KeyValuePair<string, string>>
它应该可以工作
在这篇文章中 ,
JsonConvert.SerializeObject(yourObject, new KeyValuePairConverter());
以Web API为您创建的格式获取JSON。
因此,有人可能会认为
JsonConvert.DeserializeObject<AClass>(jsonString, new KeyValuePairConverter());
将进行相反操作并正确处理Web API的样式。
我不知道这种重载是否存在。 试试看,看看会发生什么...
Dictionary<string, object> result = JsonConvert.DeserializeObject<Dictionary<string, object>>(strJsonResult);
如果是.NET 4,则可以使用DataContract属性和DataContractJsonSerializer类强制实施消息格式:
[DataContract]
public class Message
{
[DataMember]
public DateTime? Date { get; set; }
[DataMember]
public string AString { get; set; }
[DataMember]
public Dictionary<string, string> 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}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.