Json反序列化不填充属性

问题描述 投票:1回答:1

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

{"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; }
}

我正在使用List类型的Dictionary(字符串,字符串)作为Errors属性,因为我尝试过的其他类型已经破坏了反序列化器 - 这可以使序列化程序不再抛出异常。

但是,我现在正在尝试从错误中检索数据 - 我正在使用此代码:

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,所以当循环运行时我得不到任何消息。

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

有人有任何建议吗?

c# json serialization datacontractjsonserializer
1个回答
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更灵活,性能更好。

© www.soinside.com 2019 - 2024. All rights reserved.