我刚刚掌握了
JSON.NET
,到目前为止效果很好。
但是,我不知道如何在反序列化时确定序列化对象的
type
。
如何确定对象的类来进行转换?
为了澄清我的问题,假设我想这样做
string json = <<some json i don't know>>
var data = JsonConvert.DeserializeObject(json);
if (data is Person)
{
//do something
}
else if (data is Order)
{
//do something else
}
Json.NET支持这种功能吗?
您可以使用
dynamic
类型
JsonConvert.DeserializeObject<dynamic>(JSONtext)
也许对你有帮助
IDictionary < string, JToken >Jsondata = JObject.Parse(yourJsonString); foreach(KeyValuePair < string, JToken > Jsondata 中的元素) { 字符串innerKey = element.Key; if (element.Value 是 JArray) { // 处理 JArray } else if (element.Value 是 JObject) { // 处理JObject } }
如果您控制序列化,可以使用 TypeNameHandling 设置
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
var toBeSerialized = settings; // use the settings as an example data to be serialized
var serialized = JsonConvert.SerializeObject(toBeSerialized, Formatting.Indented, settings);
var deserialized = JsonConvert.DeserializeObject(serialized, settings);
var deserializedType = deserialized.GetType().Name; // JsonSerializerSettings
对于任何仍在尝试这样做的人,我建议使用
JsonConvert.DeserializeObject<ExpandoObject>(JSONtext)
借助现代跨平台 .NET (6+),您可以使用
System.Text.Json
和 JsonDocument.Parse(string jsonStr)
快速高效地读取任意 json。在大多数情况下,System.Text.Json 足够强大,不再需要 Newtonsoft.Json(又名 JSON.NET)。
查看 JSON DOM 上的官方 .NET 文档以深入了解: https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/use-dom
但是,如果您已经必须将 Newtonsoft.Json 作为依赖项安装(无论是选择还是因为另一个 Nuget 包依赖于它),您不妨使用它...
现在(Newtonsoft.Json 13.x)您可以使用
JObject.Parse()
或直接跳过 DeserializeObject 的通用,如下所示:JsonConvert.DeserializeObject(jsonStr)
省略泛型会将其隐式反序列化为 JObject,但比自己显式调用
JObject.Parse
慢。