C# 如何反序列化多维JSON

C# 如何反序列化多维JSON,c#,json,json.net,C#,Json,Json.net,我知道以前有人问过类似的问题,并且已经得到了一些答案,但我还是不明白我的问题。我有一个JSON文件包含一个多维对象,如下所示: { "Common": { "Required": "Required Entry ", "Photos": "Photos", "Videos": "Videos", "Register": "Register" }, "Forms": { "Form"

我知道以前有人问过类似的问题,并且已经得到了一些答案,但我还是不明白我的问题。我有一个JSON文件包含一个多维对象,如下所示:

{
      "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;