【问题标题】:How to deserialize an object type back to it's original type?如何将对象类型反序列化回其原始类型?
【发布时间】:2022-12-19 22:09:02
【问题描述】:

我有一个类:

public class MyClass
{
    public int Counter { get; set; }
    public string UnderlyingItemString { get; set; }
    public object UnderlyingItem { get; set; }
}

属性UnderlyingItem 可以是不同的类型。

如何将其反序列化回原始类型?我确实将 UnderlyingItem 的对象名称存储在 UnderlyingItemString

我在下面执行此代码以将其反序列化,将 UnderlyingItem 作为 JObject,但我需要它成为我创建的自定义类之一。

JsonConvert.DeserializeObject<MyClass>(myJSON);

【问题讨论】:

  • 你能把MyClass改成通用的吗?
  • 反思会给你在课堂上的信息。无需存储它。
  • @GHDevOps 是的,但是一旦对类进行序列化,反序列化器将如何区分string[]List&lt;string&gt;,或doubledecimal 之间的区别?

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


【解决方案1】:

source 看,JsonValue 只是包装了 JsonElement。所以你可以做.GetValue&lt;JsonElement&gt;()(传递这个check),然后检查它的ValueKind属性。

更好的选择是首先测试 JSON 中的基本类型。

someObject["SomeNode"] is JsonArray 
someObject["SomeNode"] is JsonObject
someObject["SomeNode"] is JsonValue

如果对象是 JsonValue 类型,可以使用 tryGetvalue 直接测试预期值类型

someObject["SomeNode"].AsValue().TryGetValue&lt;someType&gt;(输出一些类型的结果) TryGetValue 如果该值可解析为请求的类型,则返回 true。

如果预期类型完全未知/可变,则可以使用

someObject["SomeNode"].GetValue<JsonElement>().ValueKind 

诡计。但这仅适用于区分 int 和 string 以及 bool 值。在数组上尝试此操作会出现异常。因此,您首先必须使用上面的“is”样式语法进行测试。

【讨论】:

  • 这个问题是关于 Newtonsoft.Json 的,所以整篇文章都是不正确的。
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
相关资源
最近更新 更多