使用Json.NET序列化子类。

8
我正在尝试使用Json.NET来序列化子类。生成的JSON包含超类的序列化属性,但不包括子类对象的属性。
这似乎与我在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 的子类属性。 - Adam Spicer
2个回答

5
根据文档
.NET列表(继承自的类型)和.NET数组将转换为JSON数组。由于JSON数组仅支持一定范围内的值而不是属性,因此在.NET集合中声明的任何其他属性和字段都不会被序列化
所以,不要子类化List<T>,只需添加第二个属性即可。
public class MyClass 
{
    public List<string> Items { get; set; }
    public string Name { get; set; }

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

感谢您在文档中的备注。看起来我不能使用XmlSerialization所需的那些类,除非我对它们进行修改,以使它们不再继承自“IEnumerable”类。 - Adam Spicer

2

以下是我的看法。我认为你期望的结果更符合这样一个类:

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

我不会期望在MySubclass : List<string>的序列化结果中看到一个Items元素,因为ListMySubclass上都没有Items属性。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接