反序列化 JSON.NET 中的未知类型

问题描述 投票:0回答:5

我刚刚掌握了

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支持这种功能吗?

c# json.net
5个回答
34
投票

您可以使用

dynamic
类型

JsonConvert.DeserializeObject<dynamic>(JSONtext)

13
投票

也许对你有帮助

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
            }
   }


4
投票

如果您控制序列化,可以使用 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

1
投票

对于任何仍在尝试这样做的人,我建议使用

JsonConvert.DeserializeObject<ExpandoObject>(JSONtext)

0
投票

借助现代跨平台 .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
慢。

© www.soinside.com 2019 - 2024. All rights reserved.