我反序列化第三方字符串,如下所示:
{"status":4,"errors":[{"Duplicate Application":"Duplicate Application"}]}
我使用标准扩展方法:
public static T DeserializeJson<T>(string response)
where T : class
{
var s = new DataContractJsonSerializer(typeof(T));
try {
using (var ms = new MemoryStream()) {
byte[] data = System.Text.Encoding.UTF8.GetBytes(response);
ms.Write(data, 0, data.Length);
ms.Position = 0;
return (T)s.ReadObject(ms);
}
}
catch {
return default(T);
}
}
我尝试反序列化的课程看起来像这样:
[DataContract]
public class ResponseProps
{
[DataMember(Name = "status", Order = 0)]
public string ResponseCode { get; set; }
[DataMember(Name = "lead_id", Order=1)]
public string LeadId { get; set; }
[DataMember(Name = "price", Order=2)]
public decimal Price { get; set; }
[DataMember(Name = "redirect_url", Order = 3)]
public string RedirectUrl { get; set; }
[DataMember(Name = "errors", Order = 4)]
public List<Dictionary<string, string>> Errors { get; set; }
}
我使用类型为Dictionary的字符串(字符串,字符串)作为Errors属性,因为我尝试的其他类型已经破坏了反序列化器 - 这可以使序列化程序不再抛出异常。< / p>
但是,我现在正试图从错误中检索数据 - 我使用此代码:
var cr = XmlHelper.DeserializeJson<ResponseProps>(response);
var errorStore = new HashSet<string>();
foreach (var dict in cr.Errors)
{
foreach (var kvp in dict)
{
errorStore.Add(kvp.Key + ": " + kvp.Value);
}
}
我已经完成了各种测试 - dict计数为1,但是没有kvp,所以当循环运行时我没有收到任何消息。
我猜这再次归结为反序列化而不是错误的循环,但我还是无法修复它。
有人有什么建议吗?
答案 0 :(得分:1)
为了能够反序列化此类字典,您应自定义DataContractJsonSerializer
的设置,UseSimpleDictionaryFormat
设置为true
:
DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings
{
UseSimpleDictionaryFormat = true
};
var s = new DataContractJsonSerializer(typeof(T), settings);
顺便说一句,您是否有理由将DataContractJsonSerializer
与自定义DeserializeJson<T>()
方法一起使用?您可以使用JSON.Net在一行代码中执行相同操作:
var obj = JsonConvert.DeserializeObject<ResponseProps>(str);
JSON.Net也比DataContractJsonSerializer
更灵活,性能更高。