【问题标题】:Serialize subclass with Json.NET使用 Json.NET 序列化子类
【发布时间】:2012-07-06 18:33:27
【问题描述】:

我正在尝试使用 Json.NET 来序列化一个子类。生成的 json 包含超类的序列化属性,但不包含子类对象的属性。

这似乎与我发现的here on SO 的问题有关。但是不得不写一个JsonConverter 似乎有点矫枉过正。

示例子类:

public class MySubclass : List<string>
{
    public string Name { get; set; }
}

序列化示例:

MySubclass myType = new MySubclass() { Name = "Awesome Subclass" };
myType.Add("I am an item in the list");

string json = JsonConvert.SerializeObject(myType, Newtonsoft.Json.Formatting.Indented);

生成的 json:

[
  "I am an item in the list"
]

我预计结果会更像这样:

{
    "Name": "Awesome Subclass",
    "Items": [
        "I am an item in the list"
    ]
}

也许我只是在序列化时没有使用正确的配置。有人有什么建议吗?

【问题讨论】:

  • 出于多种原因,我试图摆脱 XmlSerializer,但主要是为了性能。目前我正在使用 XmlSerializer 序列化对象并实现IXmlSerializable,因为我有复杂的通用接口属性正在序列化(如果不实现IXmlSerializable,就无法反序列化)。 Json.NET 速度很快,它允许我序列化/反序列化同一个对象,而无需进行自定义序列化。缺点是我刚刚发现它不会序列化 IEnumerable 的子类上的属性。

标签: c# json json.net


【解决方案1】:

根据documentation

.NET 列表(继承自 IEnumerable 的类型)和 .NET 数组是 转换为 JSON 数组。因为 JSON 数组只支持一系列 值而不是属性,任何其他属性和字段 在 .NET 集合上声明未序列化

所以,不要继承List&lt;T&gt;,只需添加第二个属性。

public class MyClass 
{
    public List<string> Items { get; set; }
    public string Name { get; set; }

    public MyClass() { Items = new List<string>(); }
}

【讨论】:

  • 感谢文档中的注释。看起来我不能使用我用于 XmlSerialization 的类,除非我修改它们以使它们不再继承自 IEnumerable 类。
【解决方案2】:

这是我对此的看法。我认为您的预期结果会更符合这样的课程:

public class MyClass 
{
    public string Name { get; set; }
    public List<string> Items { get; set; }
}

我不希望在MySubclass : List&lt;string&gt; 的序列化结果中看到Items 元素,因为ListMySubclass 上都没有Items 属性。

由于您的类 MySubclass 实际上是一个字符串列表,我猜想(我只是在这里猜测)SerializeObject 方法只是遍历您的对象并序列化一个字符串列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2013-04-02
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多