【问题标题】:JSON Deserialize Object not workingJSON反序列化对象不起作用
【发布时间】:2023-04-06 01:07:01
【问题描述】:

我有以下问题:

(UserAttribues)Newtonsoft.Json.JsonConvert.DeserializeObject("{\"username\":\"Someone\"}");

抛出错误:

"Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'UserAttribues'."

类很简单:

 [Serializable]
 public class UserAttribues
 {
    public string username;
 }

任何帮助表示赞赏。 (我也试过 "{\"username\":\"\"Someone\"\"}")

【问题讨论】:

  • 你试过通用版吗? JsonConvert.DeserializeObject<UserAttributes>(...
  • 哦,这确实有效...你能解释一下原因吗? (如果您作为答案发布,则不接受)
  • 我不想从@StarterPack 那里窃取答案,但这是因为您明确告诉它您想要的类型,并且它会尽力映射字段。使用强制转换,您依赖于类型兼容性。 C# 不仅知道如何在任意两种类型之间映射类型成员。
  • 好的,非常感谢帮助和解释,说得通。

标签: c# json linq


【解决方案1】:

您可以为此使用 JsonConvert.Deserialize。 像这样使用它:

 var attr = JsonConvert.DeserializeObject<UserAttribues>("{\"username\":\"Someone\"}");

【讨论】:

    【解决方案2】:

    当您使用 DeserializeObject() 方法的非泛型版本时,您会得到一个 JObject。如错误所示,您不能将此 JObject 强制转换为 UserAttributes 对象。原因是在特定情况下允许类型转换,例如在兼容的原始类型之间(例如在int 和double 之间)或在相关的类之间进行转换。

    例如,如果我们有一个基类和一个派生类,class Animal 和 class Reptile : Animal,您可以安全地将 Reptile 类型的对象强制转换为 Animal,或者反过来(如果您的对象确实是 Reptile ,否则会报错)。

    因此,您的示例代码不起作用的原因是您拥有的 JObject 和您想要获取的 UserAttributes 没有任何关系。正如@StarterPack 已经指出的那样,解决方案是使用通用版本DeserializeObject&lt;some_type&gt;()。

    【讨论】:

      猜你喜欢
      • 2012-09-18
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 2018-12-12
      • 2021-07-08
      • 2014-08-11
      相关资源
      最近更新 更多