【问题标题】:Newtonsoft JSON Deserialize to object list in listNewtonsoft JSON 反序列化为列表中的对象列表
【发布时间】:2018-01-11 15:27:52
【问题描述】:

我必须将一个 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; }

}

非常感谢您的帮助

【问题讨论】:

  • Visual Studio 有一个解析器可以在 Edit -&gt; Paste Special -&gt; Past JSON as Classes 中进行分类,然后您可以将它与您自己的对象进行比较,看看有什么问题
  • 它还会告诉你 JSON 字符串的哪一部分有问题

标签: c# json json.net


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这里有一个差异:

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

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

    所以只需修复您的 json 字符串以表示一个数组或修复您的模型以仅采用 1 个对象。

    在任何情况下,使用 Visual Studio 中的解析器来帮助您查看它为您的 json 字符串再现的类模型。非常好用。

    【讨论】:

      【解决方案3】:
      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

      【讨论】:

      • 请不要只发布代码块。建议对您的答案进行一些解释。请参阅我们的how to answer page。欢迎使用 StackOverflow!
      【解决方案4】:

      Visual Studio 有一个解析器可以在 Edit -> Paste Special -> Past JSON as Classes 中进行分类,然后你可以将它与你自己的对象进行比较,看看有什么问题 – Zorkind

      我通过使用 Visual Studio 的集成解析器解决了这个问题。

      谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多