【问题标题】:Json Deserializing not populating propertiesJson反序列化不填充属性
【发布时间】:2017-12-18 14:18:57
【问题描述】:

我正在反序列化这样的第三方字符串:

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

我在 Errors 属性中使用了 Dictionary (string, string) 类型的 List,因为我尝试过的其他类型已经破坏了反序列化器 - 这使得序列化器不再抛出异常。

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

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】:

为了能够反序列化此类字典,您应该自定义DataContractJsonSerializer 的设置,将UseSimpleDictionaryFormat 设置为true

DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings
{
    UseSimpleDictionaryFormat = true
};
var s = new DataContractJsonSerializer(typeof(T), settings);

顺便说一句,您有什么理由将DataContractJsonSerializer 与您的自定义DeserializeJson&lt;T&gt;() 方法一起使用吗?你可以用JSON.Net在一行代码中做同样的事情:

var obj = JsonConvert.DeserializeObject<ResponseProps>(str);

JSON.Net 也比DataContractJsonSerializer 更灵活,性能更好。

【讨论】:

  • 这是我使用 json 的唯一瞬间——这就是我刚刚编写扩展的原因。
  • 我在使用 UseSimpleDictionaryFormat 时遇到问题 - 显示错误。我在这台机器上使用 .Net 4.0。
  • 错误是什么?尝试使用此代码:DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings(); settings.UseSimpleDictionaryFormat = true;
  • 有人告诉我这是一个语法错误 - 得到了正确的引用和命名空间。
  • 你说得对,DataContractJsonSerializerSettings 只出现在 4.5 版本的框架中。如果无法升级,请考虑使用 Json.net。
猜你喜欢
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
相关资源
最近更新 更多