Newtonsoft JSON反序列化到列表

时间:2018-01-11 15:27:52

标签: c# json json.net

我必须将json字符串反序列化为我自己的对象,该对象具有子列表,并且还有一个子列表。 像这样: 父类 - >列表 - >列表

如何对这个json字符串进行反序列化?

json示例:

{
{
    "Departementstructure": {
        "org.MainDepartments": [{
            "@MainDepartmentsId": "4",
            "@MainDepartmentsName": "Direktorium",
            "@MainDepartmentsName_En": "Board of Directors",
            "org.WorkAreas": [{
                "@Id": "30",
                "@Name": "Direktorin",
                "@WorkAreasName_En": "Director",
                "org.LIfBiDepartments": {
                    "@LIfBiDepartmentsId": "1",
                    "@LIfBiDepartmentsName": "Direktorin",
                    "@LIfBiDepartmentsName_En": "Director"
                }
            },
            {
                "@Id": "31",
                "@Name": "Kaufmännischer Geschäftsführer",
                "@WorkAreasName_En": "Executive Director of Administration",
                "org.LIfBiDepartments": {
                    "@LIfBiDepartmentsId": "52",
                    "@LIfBiDepartmentsName": "",
                    "@LIfBiDepartmentsName_En": ""
                }
            },
            {
                "@Id": "32",
                "@Name": "Wissenschaftliches Referat des Direktoriums",
                "@WorkAreasName_En": "Scientific Office to the Board of Directors",
                "org.LIfBiDepartments": {
                    "@LIfBiDepartmentsId": "53",
                    "@LIfBiDepartmentsName": "",
                    "@LIfBiDepartmentsName_En": ""
                }
            },..

jsonproperty属性来自于尝试解决方案。

   public class LomVereinsstructure
{
    public LomVereinsstructure()
    {
        Parents = new List<LomParentMainDepartment>();
    }

    [JsonProperty("Departementstructure")]
    public List<LomParentMainDepartment> Parents { get; set; }

}

[JsonArray("org.MainDepartments")]
public class LomParentMainDepartment
{
    public LomParentMainDepartment()
    {
        Children = new List<LomChildWorkarea>();
    }

    [DataMember]
    [JsonProperty("@MainDepartmentsId")]
    public int Id { get; set; }

    [DataMember]
    public string ShortName { get; set; }

    [DataMember]
    [JsonProperty("@MainDepartmentsName")]
    public string Name { get; set; }

    [DataMember]
    [JsonProperty("@MainDepartmentsName_En")]
    public string NameEn { get; set; }

    [DataMember]
    //[JsonProperty("org.WorkAreas")]
    public List<LomChildWorkarea> Children { get; set; }

}

[JsonArray("org.WorkAreas")]
public class LomChildWorkarea
{

    public LomChildWorkarea()
    {
        Children = new List<LomChildDepartment>();
    }

    [DataMember]
    [JsonProperty("@Id")]
    public int Id { get; set; }

    [DataMember]

    public string ShortName { get; set; }

    [DataMember]
    [JsonProperty("@Name")]
    public string Name { get; set; }

    [DataMember]
    [JsonProperty("@WorkAreasName_En")]
    public string NameEn { get; set; }

    [DataMember]
    //[JsonProperty("@org.LIfBiDepartments")]
    public List<LomChildDepartment> Children { get; set; }

}

[JsonArray("org.LIfBiDepartments")]
public class LomChildDepartment
{
    public LomChildDepartment()
    {
        OrganisationUnit = new LomChildOrganisationUnit();
    }

    [DataMember]
    [JsonProperty("@LIfBiDepartmentsId")]
    public int Id { get; set; }

    [DataMember]
    public string ShortName { get; set; }

    [DataMember]
    [JsonProperty("@LIfBiDepartmentsName")]
    public string Name { get; set; }

    [DataMember]
    [JsonProperty("@LIfBiDepartmentsName_En")]
    public string NameEn { get; set; }

    [DataMember]
    public LomChildOrganisationUnit OrganisationUnit { get; set; }

}

非常感谢您的帮助

4 个答案:

答案 0 :(得分:0)

要轻松生成可容纳JSON数据的类,您可以使用其中一个JSON-C#转换服务,如https://jsonutils.com/http://json2csharp.com/。如果这些不能生成类,你应该使用像https://jsonlint.com/之类的验证器来查看JSON是否确实有效(从片段看,第一个大括号应该是正方形,如果它实际上是数组)。

答案 1 :(得分:0)

这里存在差异:

在你的json字符串中,你有一个org.LIfBiDepartments的对象而不是一个数组

在您的班级模型中,您有一个public List<LomChildDepartment> Children { get; set; }

所以只需修复你的json字符串来表示一个数组或修复你的模型只需要一个对象。

在任何情况下,使用Visual Studio中的Parser来帮助您查看它为json字符串重现的类模型。它非常方便。

答案 2 :(得分:0)

public class Departement
{
    [JsonProperty("org.MainDepartments")]
    public IList<Departaments> MainDepartments { get; set; }

}

public class Departaments
{
    [JsonProperty("@MainDepartmentsId")]
    public string DpId { get; set; }
    [JsonProperty("@MainDepartmentsName")]
    public string DpName { get; set; }
    [JsonProperty("@MainDepartmentsName_En")]
    public string DpNameEn { get; set; }
    [JsonProperty("org.WorkAreas")]
    public IList<WorkAreas> WorkAreas { get; set; }
}

public class WorkAreas
{
    [JsonProperty("@Id")]
    public string WorkId { get; set; }
    [JsonProperty("@Name")]
    public string WorkName { get; set; }
    [JsonProperty("@WorkAreasName_En")]
    public string WorkNameEn { get; set; }
    [JsonProperty("org.LIfBiDepartments")]
    public LIfBiDepartments LIfBiDepartments { get; set; }
}

public class LIfBiDepartments
{
    [JsonProperty("@LIfBiDepartmentsId")]
    public string BiDpId { get; set; }
    [JsonProperty("@LIfBiDepartmentsName")]
    public string BiDpName { get; set; }
    [JsonProperty("@LIfBiDepartmentsName_En")]
    public string BiDpNameEn { get; set; }
}

Use a property in the parent class to call the object's deserializer in 
daughters classes. 

Example:
    [JsonProperty("Departementstructure")]
    public Departement MainDepartement { get; set; }

Output:

enter image description here

答案 3 :(得分:0)

  

Visual Studio在Edit中有一个解析器 - &gt;选择性粘贴 - &gt;过去JSON作为类然后你可以比较它与你自己的对象,并看到什么是错的 - Zorkind

我使用visual studio中的集成解析器解决了这个问题。

由于