【问题标题】:JSON deserialization of derived types派生类型的 JSON 反序列化
【发布时间】:2017-03-22 19:24:55
【问题描述】:
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 并且仍然遇到了同样的问题。

【问题讨论】:

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


    【解决方案1】:

    在反序列化和序列化时,你必须传递TypeNameHandling = TypeNameHandling.Objects(或AllAuto):

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

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

    TypeNameHandling 在您的应用程序中应谨慎使用 从外部源反序列化 JSON。传入类型应该是 使用自定义 SerializationBinder 进行反序列化时验证 TypeNameHandling.None 以外的值。

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

    示例fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 2017-09-03
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多