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<Rootobject>
【参考方案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 返回空值的主要内容,如果未能解决你的问题,请参考以下文章