使用C#反序列化具有随机根名称的JSON

8

我有一个JSON文件,根中有随机的名称,但子元素具有相同的结构。我想将所有子元素放入数组或列表中。

示例JSON文件:

{  
   "-LeHl495vL6vh-8CaLbD":{  
      "apiKey":"sr-tr-137-beea04e44cb452ba0da0ca090b7e61b4ec6ffc69"
   },
   "-LeHl6jrhUEMb7slZcpB":{  
      "apiKey":"sr-tr-137-aef7a23095c0c7baef1ef681bdd8bf9756ac2a17"
   }
}

我尝试过这些课程,但无法做到。

public class RequestedReport
    {
        public Dictionary<string, List<ReportData>> ReportDatas { get; set; }
    }

    public class ReportData
    {
        public string apiKey { get; set; }
    }

所以我期望反序列化后得到的输出是一个List,其中包含json文件中的所有apiKeys。
提前感谢。

每个对象中是否有多个 apiKey 条目,还是只有一个? - DavidG
每个节点只需一个API密钥。 - Ebubekir Çağrı Şen
Jon已经回答了你的问题 :) - DavidG
1个回答

11

在我看来,你的JSON直接表示了一个Dictionary<string, ReportData>。没有包装对象也没有涉及列表。如果将JSON反序列化到该类型,则应该没问题。以下是完整的示例:

using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;

class Program
{
    static void Main()
    {
        var json = File.ReadAllText("test.json");
        var reports = JsonConvert.DeserializeObject<Dictionary<string, ReportData>>(json);

        foreach (var pair in reports)
        {
            Console.WriteLine($"{pair.Key}: {pair.Value.ApiKey}");
        }
    }
}

public class ReportData
{
    [JsonProperty("apiKey")]
    public string ApiKey { get; set; }
}

如果您只需要API密钥列表,而不关心与其关联的字段名称,则可以使用:

var apiKeys = reports.Values.Select(x => x.ApiKey).ToList();

如果随机值不能保证唯一,这个代码还能正常工作吗? - Broom
我认为将反序列化转换成字典会因为重复的键而失败,而且在你的原始问题中没有保证这个值的唯一性。它看起来确实是唯一的,但我已经学会了不相信数据。 - Broom
@Broom 是的,这对于非唯一值是行不通的。我相信 JSON.Net 会为每个键使用最后一个 apiKey - DavidG
3
@Broom:根据RFC 7159的规定:“当对象内的名称不唯一时,接收该对象的软件的行为是不可预测的。”换句话说,任何生成这样的JSON的东西都是在自找麻烦。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接