【问题标题】:Parsing Json with nested and variable dictionaries using Newtonsoft [duplicate]使用 Newtonsoft 解析带有嵌套和变量字典的 Json [重复]
【发布时间】:2021-06-22 09:02:17
【问题描述】:

我有一个如下所示的 Json:

{
    "id": "1367",
    "title": "ticket sample",
    "custom_fields": {
        "13084": {
            "E0D4ED43": "South"
        },
        "13085": {
            "F19DF0D6": "Atlanta"
        },
        "13089": {
            "AF0EC62F": "Peter Johnson"
        }
    }
}

为了解析它,我的类使用嵌套字典:

class incident
    {
        public string id { get; set; }
        public string title { get; set; }
        public Dictionary<int, Dictionary<string, string>> custom_fields { get; set; }
    }

这就像一个魅力,直到我发现自定义字段并不总是相同,例如我可以收到:

{
    "id": "1367",
    "title": "ticket sample",
    "custom_fields": {
        "13084": {
            "E0D4ED43": "South"
        },
        "13085": {
            "F19DF0D6": "Atlanta"
        },
        "13086": "SAP",
        "13088": {
            "AE3ED01A": "Commercial"
        }
    }
}

如果您查看自定义字段“13086”,它不包含另一个对象(它只是一个字符串),所以当我尝试使用前一个类解析时它会失败。

这些是两种不同响应的示例,但收到的密钥发生了很大变化(这就是我使用字典的原因,因为我不知道每张票会收到多少个和哪些)

【问题讨论】:

  • 您将需要使用自定义转换器。您是否知道自定义字段值始终是字符串或字符串字典,或者它们可以是 anything
  • @dbc 现在我只看到字符串或字符串字典,但你只是吓到我了!我认为它可以是任何东西,甚至是数组......
  • @HernanRomero 我认为你应该使用 Dictionary
  • @DilshodK 你得到一个非反序列化的 JToken 那么你将如何处理它? -- 编写一个 JsonConverter 来反序列化这些对象并不复杂,无论它们在输入中是什么。只需决定要反序列化到什么。关键是您是否需要序列化并序列化回什么。如果将所有序列化回Dictionary&lt;string, string&gt; 可能是一件事,那么这很简单。可以修改第一条评论中发布的链接以处理此用例。
  • @HernanRomero,你可以序列化和反序列化到类事件 { public string id { get;放; } 公共字符串标题 { 获取;放; } 公共字典 custom_fields { 获取;放; } }

标签: c# json dictionary parsing json.net


【解决方案1】:

感谢大家的cmets。感谢他们,我想通了并找到了适合我的解决方案。

基本上,我使用了@DilshodK 提出的“Dictionary”,然后检查对象的类型。如果对象是 JObject 我用另一个 Dictionary 重新反序列化,如果不是我使用原始值。

class incident_custom
    {
        public string id{ get; set; }
        public string title { get; set; }
        public Dictionary<int, object> custom_fields { get; set; }
    }
incident_custom item = JsonConvert.DeserializeObject<incident_custom>(responseBody);

Console.WriteLine(item.title);

foreach (var field in item.custom_fields)
{
    if (field.Value.GetType() == typeof(Newtonsoft.Json.Linq.JObject))
    {

        Dictionary<string, object> values = JsonConvert.DeserializeObject<Dictionary<string, object>>(field.Value.ToString());

        foreach (var value in values)
        {
            Console.WriteLine(field.Key + " - " + value.Value);
        }
    }
    else
    {
        Console.WriteLine(field.Key + " - " + field.Value);
    }
}

【讨论】:

    猜你喜欢
    • 2021-09-25
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2019-11-29
    • 2016-02-19
    • 1970-01-01
    相关资源
    最近更新 更多