json.net (newtonsoft)我正在浏览文档,但我找不到任何关于这一点或最好的方法。
public class Base { public string Name; } public class Derived : Base { public string Something; } JsonConvert.Deserialize<List<Base>>(text);
现在我在序列化列表中有了Derived对象。我如何反序列化列表并取回派生类型?
ut6juiuv1#
您必须启用类型名称处理,并将其作为序列化和反序列化操作的设置参数传递给(反)序列化程序。
Base object1 = new Base() { Name = "Object1" }; Derived object2 = new Derived() { Something = "Some other thing" }; List<Base> inheritanceList = new List<Base>() { object1, object2 }; JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }; string Serialized = JsonConvert.SerializeObject(inheritanceList, settings); List<Base> deserializedList = JsonConvert.DeserializeObject<List<Base>>(Serialized, settings);
这将导致派生类的正确反序列化。它的缺点是它将命名您正在使用的所有对象,因此它将命名您正在放置对象的列表。
uqxowvwt2#
如果您将类型存储在text中(在本场景中应该如此),则可以使用JsonSerializerSettings。参见:how to deserialize JSON into IEnumerable with Newtonsoft JSON.NET
text
JsonSerializerSettings
**使用TypeNameHandling = TypeNameHandling.None以外的任何东西都可能使您打开a security vulnerability。
TypeNameHandling = TypeNameHandling.None
dzjeubhm3#
既然这个问题如此流行,如果你想控制类型属性名和它的值,补充一下该怎么做可能是有用的。长的路是编写定制的JsonConverter来处理(反)序列化,方法是手动检查和设置type属性。一种更简单的方法是使用JsonSubTypes,它通过属性处理所有样板文件:
JsonConverter
[JsonConverter(typeof(JsonSubtypes), "Sound")] [JsonSubtypes.KnownSubType(typeof(Dog), "Bark")] [JsonSubtypes.KnownSubType(typeof(Cat), "Meow")] public class Animal { public virtual string Sound { get; } public string Color { get; set; } } public class Dog : Animal { public override string Sound { get; } = "Bark"; public string Breed { get; set; } } public class Cat : Animal { public override string Sound { get; } = "Meow"; public bool Declawed { get; set; } }
7vhp5slm4#
使用这个JsonKnownTypes,它的使用方式非常相似,它只是将鉴别器添加到json中:
[JsonConverter(typeof(JsonKnownTypeConverter<BaseClass>))] [JsonKnownType(typeof(Base), "base")] [JsonKnownType(typeof(Derived), "derived")] public class Base { public string Name; } public class Derived : Base { public string Something; }
现在,当你在JSON中序列化对象时,将添加带有"base"和"derived"值的"$type",它将用于反序列化序列化列表示例:
"base"
"derived"
"$type"
[ {"Name":"some name", "$type":"base"}, {"Name":"some name", "Something":"something", "$type":"derived"} ]
holgip5t5#
只需在Serialize方法中添加对象
var jsonMessageBody = JsonSerializer.Serialize<object>(model);
5条答案
按热度按时间ut6juiuv1#
您必须启用类型名称处理,并将其作为序列化和反序列化操作的设置参数传递给(反)序列化程序。
这将导致派生类的正确反序列化。它的缺点是它将命名您正在使用的所有对象,因此它将命名您正在放置对象的列表。
uqxowvwt2#
如果您将类型存储在
text
中(在本场景中应该如此),则可以使用JsonSerializerSettings
。参见:how to deserialize JSON into IEnumerable with Newtonsoft JSON.NET
**使用
TypeNameHandling = TypeNameHandling.None
以外的任何东西都可能使您打开a security vulnerability。dzjeubhm3#
既然这个问题如此流行,如果你想控制类型属性名和它的值,补充一下该怎么做可能是有用的。
长的路是编写定制的
JsonConverter
来处理(反)序列化,方法是手动检查和设置type属性。一种更简单的方法是使用JsonSubTypes,它通过属性处理所有样板文件:
7vhp5slm4#
使用这个JsonKnownTypes,它的使用方式非常相似,它只是将鉴别器添加到json中:
现在,当你在JSON中序列化对象时,将添加带有
"base"
和"derived"
值的"$type"
,它将用于反序列化序列化列表示例:
holgip5t5#
只需在Serialize方法中添加对象