反序列化为正确的子对象

时间:2014-03-17 21:31:44

标签: c# json serialization json.net

我正在尝试将父级和不同子级的混合反序列化为List<parent>。不幸的是,我孩子的所有额外字段都被丢弃,并被序列化为父母。

我一直试图弄清楚如何将对象命名为一个整体,以将它们链接到正确的子类。我对此没有任何结果。

这是一个简单的父类和子类,我尝试从以下位置序列化对象:

[JsonObject(MemberSerialization.OptIn)]
    class Product
    {
        [JsonProperty]
        public string Name { get; set; }
        [JsonProperty]
        public int Amount { get; set; }
        [JsonProperty]
        public int Value { get; set; }
    }

    [JsonObject(MemberSerialization.OptIn)]
    class ProductType : Product
    {
        [JsonProperty(Order = 4)]
        public int Volume { get; set; }
    }

序列化不是问题,卷被添加为“特殊产品”对象的最终字段。目标是拥有多个孩子。在列表中序列化2个已创建对象的代码下方。它无法反序列化,因为它将两个对象作为正常产品放回列表中:

Product test1 = new Product { Name = "Simple Product", Amount = 110, Value = 10 };
ProductType test2 = new ProductType { Name= "Special Type", Amount = 230, Value = 22, Volume = 6 };

List<Product> ProductList = new List<Product>() { test1, test2 };             

string output = JsonConvert.SerializeObject(ProductList, Formatting.Indented); //Works correctly.

List<Product> DeSerialized = JsonConvert.DeserializeObject<List<Product>>(output); //Fails creating child object.

1 个答案:

答案 0 :(得分:2)

我必须启用typename处理并将其作为设置参数传递给序列化程序和反序列化程序。我被困在这上面因为我试图在课堂上做这样的事情。

JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };

string output = JsonConvert.SerializeObject(ProductList, Formatting.Indented, settings);

List<product> deserializedList = JsonConvert.DeserializeObject<List<product>>(output, settings);

仍然应该有一个选项来序列化你想要的类,如上例所示我不需要序列化和存储基类/父类,因为我已经在(de)序列化时给出了该类型。我也不需要序列化List对象,这尤其会带来不必要的混乱。因此,虽然这是我的问题的解决方案,我正在寻找一个更好的方法来做到这一点,以下是不会给出错误,但似乎也没有做任何事情:

[JsonObject(ItemTypeNameHandling = TypeNameHandling.Objects/all/auto/...)]
class ...