【问题标题】:De-Serialize JSON List GUID objects containing child GUID objects反序列化包含子 GUID 对象的 JSON 列表 GUID 对象
【发布时间】:2021-05-05 08:31:48
【问题描述】:

下面的 json 字符串是“作业”列表,顶层 Guid 是 assignmentId。 每个分配都有一个用于人员和分配给他们的项目的 Guid 标识符。 我已经尝试了许多基于 S.O. 上的 JSON 反序列化答案的变体。 我目前的尝试是

public class Assignments
{
     public Dictionary<Guid, Assignment> Documents { get; set; }
}
public class Assignment
{
    public Guid Id { get; set; }
    public Dictionary<Guid, AssignmentDetail> Assignments { get; set; }

}

public class AssignmentDetail
{
    [JsonProperty("personId")]
    public Guid PersonId { get; set; }
    [JsonProperty("itemId")]
    public Guid TaskId { get; set; }
}

JSON 看起来像

 {
  "abd9657b-8f5f-4320-a47a-9d8442003217": {
    "complete": null,
    "due": null,
    "estimate": null,
    "itemId": "f921a6d4-ee77-4655-9c97-1e29c29c8796",
    "personId": "c87b496f-0aba-4339-bb28-77d73283b504"
  },
  "353179f7-24ac-4331-ab86-41eabb8a9269": {
    "complete": null,
    "due": null,
    "estimate": null,
    "itemId": "d2a5de46-4100-47b8-8b8d-cad064c47fba",
    "personId": "9705d366-0d00-481b-a3f1-c8e596f4a7c7"
  },
  "d04b346b-e941-4985-92b1-45cc65925edf": {
    "complete": null,
    "due": null,
    "estimate": null,
    "itemId": "631e653e-7595-46cb-b01a-06fb1e66759a",
    "personId": "9705d366-0d00-481b-a3f1-c8e596f4a7c7"
  }
}

当前操作是

var obj = JsonConvert.DeserializeObject<Assignments>(result);

obj在操作后为null。

忽略 JSON 字符串中缺少的前括号。不知何故,我不能再编辑该部分了。 谢谢

【问题讨论】:

  • 您的 JSON 看起来像 Dictionary&lt;GUID, SomeClass&gt;,其中 SomeClass 有五个属性,其中三个可以为空(complete、due 和 estimate),另外两个是 GUID(@987654329 @ 和 personId)。它也可能是一个字典,其中的值是字典(但我怀疑这不是你想要的(因为complete 不太可能是 GUID)。你没有三个类。
  • 感谢 FlyDog57。你踢回了正确的道路。答案很简单 var obj = JsonConvert.DeserializeObject>(result);把它作为答案怎么样,这样你就可以得到一些分数了

标签: c# json.net


【解决方案1】:

这样的事情怎么样。

首先,我重组了您的类,将它们合并为一个 AssignmentDetail 类。我将前三个成员的类型设置为string。它们可以是任何东西——只要它可以为空。我不知道它们应该是什么类型,你所有的数据都表明它们是null。

public class AssignmentDetail
{
    [JsonProperty("complete")]
    public string Complete { get; set; }

    [JsonProperty("due")]
    public string Due { get; set; }

    [JsonProperty("estimate")]
    public string Estimate { get; set; }

    [JsonProperty("itemId")]
    public Guid ItemId { get; set; }

    [JsonProperty("personId")]
    public Guid PersonId { get; set; }
    
}

然后我让您的 JSON 对 C# 更友好(将内引号更改为单引号;它们是等效的):

private const string TheJson = @"
  {
    'abd9657b-8f5f-4320-a47a-9d8442003217': {
    'complete': null,
    'due': null,
    'estimate': null,
    'itemId': 'f921a6d4-ee77-4655-9c97-1e29c29c8796',
    'personId': 'c87b496f-0aba-4339-bb28-77d73283b504'
    },
    '353179f7-24ac-4331-ab86-41eabb8a9269': {
    'complete': null,
    'due': null,
    'estimate': null,
    'itemId': 'd2a5de46-4100-47b8-8b8d-cad064c47fba',
    'personId': '9705d366-0d00-481b-a3f1-c8e596f4a7c7'
    },
    'd04b346b-e941-4985-92b1-45cc65925edf': {
    'complete': null,
    'due': null,
    'estimate': null,
    'itemId': '631e653e-7595-46cb-b01a-06fb1e66759a',
    'personId': '9705d366-0d00-481b-a3f1-c8e596f4a7c7'
    }
}";

有了这个,这段代码就可以工作了:

var result = JsonConvert.DeserializeObject<Dictionary<Guid, AssignmentDetail>>(TheJson);

结果是一个包含三个条目的字典,每个条目都有一个 GUID,每个条目都有适当的 AssignmentDetail 数据。

【讨论】:

  • 仅供参考——尽管 Json.Net 允许单引号作为 JSON 中的字符串分隔符,但它们实际上是非标准的。见JSON.org。我不建议仅仅为了使代码更“友好”而用非标准分隔符替换标准分隔符。
  • @BrianRogers:很好,谢谢。不过,它确实使const strings 在示例代码中更易于阅读。我在实际代码中使用的大多数 JSON 都来自程序外部。
  • @Flydog57 关键是你的工作结果声明。 > 一旦我理解了 Dictionary 的正确结构,一切就都好了。我无法控制 JSON 字符串,它是一个包含 26K 条目的服务响应。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2012-08-13
  • 2016-10-01
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
相关资源
最近更新 更多