JSON反序列化派生类型

时间:2016-11-09 01:58:16

标签: json serialization json.net deserialization json-deserialization

class Attribute1
{
}

class Attribute2 : Attribute1
{
}
class class1
{
    Attribute1 attr1;
}

class class2  : class1
{
    Attribute2 attr2;
}


var serializerSettings = new JsonSerializerSettings(){TypeNameHandling = TypeNameHandling.Objects};
class2 a = SomeValidObjectoftype Class2;
string serializedClass2 = JsonConvert.SerializeObject(a, serializerSettings);
var am =  JsonConvert.DeserializeObject<Class2>(serializedClass1);

以上所有都是JSON属性和对象。我想要做的是序列化和反序列化,而不是丢失类型。 反序列化时我失去了am.attr2的类型。目前它将以Attribute1的形式返回。我希望它为Attribute2。那可能吗?如果是这样,有人会指出我正确的做法。我包括SerializationSettings仍然遇到了同样的问题。

1 个答案:

答案 0 :(得分:1)

您需要在反序列化和序列化时传递TypeNameHandling = TypeNameHandling.Objects(或AllAuto):

var am =  JsonConvert.DeserializeObject<Class2>(serializedClass1, serializerSettings );

我认为这是出于安全原因:这意味着在使用默认设置进行反序列化期间无法注入意外类型。来自docs

  申请时应谨慎使用

TypeNameHandling   从外部源反序列化JSON。传入类型应该是   使用a反序列化时使用自定义SerializationBinder进行验证   除TypeNameHandling.None以外的其他值。

有关此警告需要的讨论,请参阅TypeNameHandling caution in Newtonsoft Json

示例fiddle