【问题标题】:Deserializing an unknown type in JSON.NET反序列化 JSON.NET 中的未知类型
【发布时间】:2019-08-12 05:57:07
【问题描述】:

我刚刚获得了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 是否支持这种功能?

【问题讨论】:

  • 这也是我的第一个想法。但是,类型是Newtonsoft.Json.Linq.JObject
  • JSON 是一种纯格式,不会在序列化时保留元数据。您必须知道要反序列化的类型。
  • @HamletHakobyan,那我该如何区分不同的对象呢?当客户端向我的服务器发送一些东西时,我必须能够检测到它是什么
  • 客户端如何向你的服务器发送数据?您必须有一些协议来确定客户端发送的内容。
  • 如果 GetType() 返回 JObject 键的值只是另一个 json 对象。您需要递归到它并读取后续键。

标签: c# json.net


【解决方案1】:

你可以使用dynamic类型

JsonConvert.DeserializeObject<dynamic>(JSONtext)

【讨论】:

  • Console.WriteLine(JsonConvert.DeserializeObject&lt;dynamic&gt;(serializedMessage).GetType()); 只是给我Newtonsoft.Json.Linq.JObject
  • 我认为 Json 无法识别对象的类型。您需要手动检查。
【解决方案2】:

也许对你有帮助

IDictionary Jsondata = JObject.Parse(yourJsonString); foreach(KeyValuePair Jsondata 中的元素) { 字符串 innerKey = element.Key; if (element.Value 是 JArray) { // 处理 JArray } else if (element.Value 是 JObject) { // 处理 JObject } }

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2011-09-19
      相关资源
      最近更新 更多