JsonConvert.DeserializeObject 返回空值

Posted

技术标签:

【中文标题】JsonConvert.DeserializeObject 返回空值【英文标题】:JsonConvert.DeserializeObject return null value 【发布时间】:2021-12-21 02:47:41 【问题描述】:

我进行了搜索,但似乎没有找到任何解决方案...这是我的示例 Json:


  "WSettings":
  "Message":"\"We are the universe's way of experiencing itself.\"<br/>- Kurzgesagt -",
  "universalMessageProcChance":10,
  "Hi":
         "altName":"Hi",
         "normalState":"hi",
         "hState":"hi_h",
         "aState":"hi_a",
         "background":"bg_owo_r",
         "stateLayout":4,
         "backgroundLayout":1,
         "eventMessage":"Da"
     ,
  "Yu":
         "altName":"Al",
         "normalState":"al",
         "hState":"al_h",
         "aState":"ali_a",
         "background":"bg_owo_b",
         "stateLayout":4,
         "backgroundLayout":1,
         "eventMessage":"Da"
    
  

这是我的课:

public class WSettings

    public string Message  get; set; 
    public int universalMessageProcChance  get; set; 

    [JsonProperty("Hi")]
    public StateW Hi  get; set; 

    [JsonProperty("Yu")]
    public StateW Yu  get; set; 


public class StateW

    public string altName  get; set; 
    public string normalState  get; set; 
    public string hState  get; set; 
    public string aState  get; set; 
    public string background  get; set; 
    public int stateLayout  get; set; 
    public int backgroundLayout  get; set; 
    public string eventMessage  get; set; 

这个要反序列化:

var w = Newtonsoft.Json.JsonConvert.DeserializeObject<WSettings>(File.ReadAllText(@"json.txt"));

它将所有属性返回为空。老实说,我不知道那里出了什么问题,所以请原谅我的无知。有任何帮助:)

【问题讨论】:

"WSettings" 是对象的属性。你需要那个对象来反序列化它public class Rootobject public Wsettings WSettings get; set; 然后DeserializeObject&lt;Rootobject&gt; 【参考方案1】:

您将需要 WSettings 上的另一个包装类。 试试这样的:

public class WSettingsParent

    public WSettings WSettings  get; set; 

然后像这样反序列化:

WSettingsParent myDeserializedClass = JsonConvert.DeserializeObject<WSettingsParent>(File.ReadAllText(@"json.txt")));

这是一个有用的工具,用于检查您是否可以使用它来确保正确设置类的结构:https://json2csharp.com/ 只需将您的 json 粘贴到左侧,它就会相应地生成类。 (您可能需要稍作修改,但大图可见)。

【讨论】:

【参考方案2】:

如果您仔细查看您的 JSON,WSettings 被包裹在一个开闭大括号内。它表示WSetting也是***/根级JObject的一个属性。

创建新的Root 类并包含WSettings 作为它的属性,并使用此根类反序列化您的json

附加类:

public class Root

   //Property of existing WSettings class   
   public WSettings WSettings  get; set; 

反序列化:

using Newtonsoft.Json;
....

var w = JsonConvert.DeserializeObject<Root>(File.ReadAllText(@"json.txt"));
                                   //^^^^^^ Use Root class instead of WSettings

【讨论】:

【参考方案3】:

已经提供了一个很好的答案。您也可以尝试使用 JSON 解析器。它的工作

var jsparse = JObject.Parse(File.ReadAllText(@"json.txt"));  
        var w = JsonConvert.DeserializeObject<WSettings>(jsparse["WSettings"].ToString());

【讨论】:

以上是关于JsonConvert.DeserializeObject 返回空值的主要内容,如果未能解决你的问题,请参考以下文章