我正在使用4.0.8版本的Newtonsoft.Json,并尝试将其与Web API一起使用。所以我想用 JSON 反序列化
JsonConvert.DeserializeObject<AClass>(jsonString);
这一直有效,直到我将字典作为属性添加到此类并想要反序列化它。
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}