【问题标题】:deserializing dynamic named JSON attributes to a C# class将动态命名 JSON 属性反序列化为 C# 类
【发布时间】:2021-04-08 11:03:43
【问题描述】:
{
  "Documents": {
    "c97bba6f-c8ab-4453-91f8-f663f478910c": {
      "id": "c97bba6f-c8ab-4453-91f8-f663f478910c",
      "name": "name",
      "sys": {
        "c67bfa6f-c8ab-4453-91f8-f663f478910c": {
          "id": "c97bba6f-c8ab-4453-91f8-f663f478910c",
          "name": "sys name"
        },
        "a67bfa6f-c8ab-4453-91f8-f663f478910c": {
          "id": " a67bfa6f-c8ab-4453-91f8-f663f478910c",
          "name": "sys name"
        }
      }
    },
    "f97bba6f-c8ab-4453-91f8-f663f478910c": {
      "id": "c97bba6f-c8ab-4453-91f8-f663f478910c",
      "name": "OZL - B - MECH - AC - Fan Coil Units",
      "sys": {}
    }
  }
}

我有上面表格中的 JSON 数据,但在将其反序列化为 C# 类时遇到了麻烦。我遇到的问题是 GUID 用于定义 Documents 对象具有的对象,而不是具有文档列表的文档对象。

我尝试创建一个包含对象列表的文档对象,并使用 Newtonsoft 反序列化到该对象中。我还尝试了文档对象中的字符串字典。这些都不起作用。

任何意见或想法将不胜感激。

编辑:我遇到的最大问题是Dictionary<GUID, object> 的嵌套。 Newtonsoft 不会映射到第一个对象中的字典。这是我所拥有的:

public class Documents {
   public dictionary<Guid, System> data { get; set; }
}

public class System {
   public Guid Id { get; set;}
   public string Name { get; set; }
   public dictionary<guid, someOtherobject> otherData { get; set;}
}

【问题讨论】:

  • 一般来说,您可以使用字典。 -- 你能发布一个结构合理的有效 JSON 吗?
  • 这是一个dictionary &lt; Guid, object&gt;,你可以看到Id是一样的
  • 顺便说一句,如果您尝试匿名一些信息,请确保结果看起来不像毕加索。这几乎是野蛮行为。如果你有一个有效的 Json,你可以使用像 app.quicktype.io 这样的工具。这将重新调整 Dictionary 并生成一个不错的类
  • 类的自动生成不是问题,问题在于对象的名称是动态的,并且它们具有一组也是动态的项目。

标签: c# json json.net deserialization


【解决方案1】:

根据您的 JSON,您需要的类结构是这样的:

public class RootObject
{
    public Dictionary<Guid, Document> Documents { get; set; }
}

public class Document
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public Dictionary<Guid, Sys> Sys { get; set; }
}

public class Sys
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

然后像这样反序列化成RootObject类:

var root = JsonConvert.DeserializeObject<RootObject>(json);

这是一个工作演示:https://dotnetfiddle.net/Uycomw

【讨论】:

    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多