C# 如何反序列化多维JSON
我知道以前有人问过类似的问题,并且已经得到了一些答案,但我还是不明白我的问题。我有一个JSON文件包含一个多维对象,如下所示:C# 如何反序列化多维JSON,c#,json,json.net,C#,Json,Json.net,我知道以前有人问过类似的问题,并且已经得到了一些答案,但我还是不明白我的问题。我有一个JSON文件包含一个多维对象,如下所示: { "Common": { "Required": "Required Entry ", "Photos": "Photos", "Videos": "Videos", "Register": "Register" }, "Forms": { "Form"
{
"Common": {
"Required": "Required Entry ",
"Photos": "Photos",
"Videos": "Videos",
"Register": "Register"
},
"Forms": {
"Form": "Forms",
"Name": "Name",
"Phone": "Phone",
"Email": "Email",
"Message": "Message"
},
"Sections": {
"Home": {
"EventDateTime": "",
"MainTitle": "",
"SubTitle": ""
},
"About": {},
"Venue": {},
"Schedule": {},
"Speakers": {},
"Sponsors": {},
"Price": {},
"Contact": {}
}
}
我希望将其反序列化到我的视图模型(LanguagesViewModel)中,如下所示:
[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class LanguagesViewModel
{
public Common Common { get; set; }
public Buttons Buttons { get; set; }
public Forms Forms { get; set; }
public Navbar Navbar { get; set; }
public Sections Sections { get; set; }
}
public class Common
{
public string Required { get; set; }
public string Photos { get; set; }
public string Videos { get; set; }
public string Register { get; set; }
}
public class Forms
{
public string Form { get; set; }
public string Name { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
public string Message { get; set; }
}
public class Sections
{
public Home Home { get; set; }
public About About { get; set; }
public Venue Venue { get; set; }
public Schedule Schedule { get; set; }
public Speakers Speakers { get; set; }
public Sponsors Sponsors { get; set; }
public Price Price { get; set; }
public Contact Contact { get; set; }
}
public class Home
{
public string EventDateTime { get; set; }
public string MainTitle { get; set; }
public string SubTitle { get; set; }
}
public class About
{
}
public class Venue
{
}
public class Schedule
{
}
public class Speakers
{
}
public class Sponsors
{
}
public class Price
{
}
public class Contact
{
}
}
要执行此操作,请参阅一些代码段:
using (StreamReader sr = new StreamReader(language_file_path))
{
string contents = sr.ReadToEnd();
items = JsonConvert.DeserializeObject<LanguagesViewModel>(contents);
}
不是第二级,不是第三级。我做错了什么还是错过了什么?非常感谢您的帮助
谢谢。您可以使用这个静态类
public static class JsonHelper
{
public static T ToObject<T>(this string content)
{
var obj = JObject.Parse(content).GetValue(typeof(T).Name);
if (obj == null)
throw new NullReferenceException();
else
return obj.ToObject<T>();
//This ToObject here is default method written in object
}
}
在多维对象中,可以这样访问它们
//content["level1"]["level2"]["level3"] & ...
var sections= (Home)content["Sections"]["Home"];
这种方法也可以,但我更喜欢用魔术弦的方法
//Creating your JSON object
JObject content = JObject.Parse(sr.ReadToEnd()//or your json);
//content["your object name"] let you access to you object
var common =(Common)content["Common"];
dynamic jsonObject = new JObject.Parse(sr.ReadToEnd());
var common = jsonObject.Common;
您可以在中找到更多信息
我希望这有帮助 如果我是正确的,那么选择in意味着您需要在.NET能够分配值的所有内容上显式地说[JsonProperty(“yourJsonKeyHere”)]。试试看。你试过这个方法吗?如果您计划每次对整个对象进行反序列化,我不建议使用ng
[JsonObject(MemberSerialization=MemberSerialization.OptIn)]
。这没有意义,因为您希望所有属性都被反序列化。@Jabberwocky刚刚尝试过,它对我有效!非常感谢你。还有一件事您可能想知道,我没有在视图模型类中的每个属性上都放置JsonProperty,但它仍然有效。@rhys_stubbs您是对的,我使用[JsonObject(MemberSerialization=MemberSerialization.OptOut)],而不是[JsonObject(MemberSerialization=MemberSerialization.OptIn)],它也可以正常工作。请参见此处以查找更多详细信息。最好在中心位置的模型级别使用属性。如果他在多个地方这样使用它,这会变得非常混乱。@Train你是对的。但在某些情况下,很难访问类。以前我有使用一个API的经验,该API返回的数据量巨大,而我只需要10%的属性。但是为所有这些类实现类会消耗更多的时间,并且会使编程变得非常复杂。但是,如果要像你所说的那样在多个地方使用它,最好使用属性。在这种情况下,创建一个扩展方法,将其保留在中心位置。@ShervinIvari这种方式看起来可能更干净,但我认为使用IntelliSense比键入更方便和安全。@Jack我会按照你说的更新我的答案,只需调用ToObject,其余的函数就可以了,而且您将拥有IntelliSense菜单!
//content["level1"]["level2"]["level3"] & ...
var sections= (Home)content["Sections"]["Home"];
dynamic jsonObject = new JObject.Parse(sr.ReadToEnd());
var common = jsonObject.Common;