Newtonsoft的JSON.NET不会序列化`IEnumerable`类型的属性

时间:2017-10-23 06:16:23

标签: c# json serialization json.net ienumerable

问题

我正在使用JSON.NET来序列化复杂模型,我遇到了一个情况,我的反序列化对象不等于序列化对象。

这种情况是由JSON.NET处理IEnumerable类型的方式引起的,

当JSON.NET遇到IEnumerable类型时,它将它作为一个简单的数组,
抛弃所有其他物业。
即使使用TypeNameHandling = TypeNameHandling.All,字段仍然会从Wrapping JSON对象中忽略。

最小再现示例:

public class MyModel : List<string>
{
  public MyModel(string id) 
  { 
    Id = id; 
    Add("hello");
    Add("world");
  }

  public string Id { get; private set; }
}

反序列化以下类(使用TypeNameHandling = TypeNameHandling.All) 生产:

{
  "$type": "...MyModel[], ...",
  "$values": [
    "hello", 
    "world"
  ]
}

注意将属性Id从序列化字符串中删除。

解决方法:

现在,我只是将我的所有类型翻译为不是IEnumerable,而是将基类作为成员包含。

e.g。

public class MyModel
{
  public List<string> Values { get; private set; }
  public MyModel(string id) 
  { 
    Values = new List<string>();
    Id = id; 
    Values.Add("hello");
    Values.Add("world");
  }

  public string Id { get; private set; }
}

虽然,对于我的模型,这种解决方法在某种程度上是可以接受的...... 这个序列化注定要分散到更多模型然后我的, 而且我不想从模型中“禁止”模型功能(例如IEnumerable)。

-

任何人都知道如何克服这个问题?

由于

0 个答案:

没有答案