Json反序列化不填充属性

时间:2017-12-18 14:18:58

标签: c# json serialization datacontractjsonserializer

我反序列化第三方字符串,如下所示:

{"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,所以当循环运行时我没有收到任何消息。

我猜这再次归结为反序列化而不是错误的循环,但我还是无法修复它。

有人有什么建议吗?

1 个答案:

答案 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更灵活,性能更高。