将JSON反序列化为具有动态字段名的C#类

将JSON反序列化为具有动态字段名的C#类,c#,.net,json,deserialization,C#,.net,Json,Deserialization,我的问题很类似于。我试图调整他们的解决方案以满足我的需要,但似乎无法找到适合我的JSON的解决方案 以下是JSON的一个示例: { "0fea8f8a-4169-495d-8307-50bc333fd87d": { "serviceId": "4cb9125a-1eaa-4bd4-a473-cfccec0f3c63" }, "0564d078-94f5-4f97-8398-b9f58a51f70b": { "serviceId": "00000000-0000-000

我的问题很类似于。我试图调整他们的解决方案以满足我的需要,但似乎无法找到适合我的JSON的解决方案

以下是JSON的一个示例:

{
  "0fea8f8a-4169-495d-8307-50bc333fd87d": {
    "serviceId": "4cb9125a-1eaa-4bd4-a473-cfccec0f3c63"
  },
  "0564d078-94f5-4f97-8398-b9f58a51f70b": {
    "serviceId": "00000000-0000-0000-0000-000000000000"
  },
  "f9a165d2-967d-4733-8599-1074270dae2e": {
    "serviceId": "00000000-0000-0000-0000-000000000000"
  },
  "86ccdsbf-e7ad-4851-93ff-6ec817469c1e": {
    "serviceId": "00000000-0000-0000-0000-000000000000"
  }
}
如您所见,它是
Id_1:{serviceId:Id_2}

我认为这可以最简单地用C#类来表示:
List
,基本上是一个
列表,但我愿意接受其他选择

以下是我根据上面链接的帖子尝试的解决方案:

class PolicyMetadata
    {
        [JsonConverter(typeof(MetadataConverter))]
        public KeyValuePair<string,string>[] idPairs { get; set; }

    }

class MetadataConverter : JsonConverter
{

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // deserialize as object
        var pairs = serializer.Deserialize<JObject>(reader);
        var result = new List<KeyValuePair<string, string>>();

        // create an array out of the properties
        foreach (JProperty property in pairs.Properties())
        {
            var pair = property.Value.ToObject<KeyValuePair<string, string>>();
            result.Add(pair);
        }

        return result.ToArray();
    }



    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(KeyValuePair<string, string>[]);
    }
}
类策略元数据
{
[JsonConverter(类型(MetadataConverter))]
公钥值对[]idPairs{get;set;}
}
类MetadataConverter:JsonConverter
{
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
//反序列化为对象
var pairs=序列化程序。反序列化(读取器);
var result=新列表();
//从属性中创建一个数组
foreach(JProperty属性成对出现。Properties())
{
var pair=property.Value.ToObject();
结果:添加(对);
}
返回result.ToArray();
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
抛出新的NotImplementedException();
}
公共覆盖布尔CanConvert(类型objectType)
{
返回objectType==typeof(KeyValuePair[]);
}
}
我称之为:
var response=JsonConvert.DeserializeObject(内容)
但是这个结果是一个空值,所以我肯定是做错了什么。我尝试在ReadJson方法中放置断点和打印语句,但它们从未被触发,因此我不确定该代码是否正在实际运行

模型:

public class Service
{
    public string ServiceId { get; set; }
}
使用字典:

static void Main()
{
    string json = @"
{
    ""0fea8f8a-4169-495d-8307-50bc333fd87d"": {
    ""serviceId"": ""4cb9125a-1eaa-4bd4-a473-cfccec0f3c63""
    },
    ""0564d078-94f5-4f97-8398-b9f58a51f70b"": {
    ""serviceId"": ""00000000-0000-0000-0000-000000000000""
    },
    ""f9a165d2-967d-4733-8599-1074270dae2e"": {
    ""serviceId"": ""00000000-0000-0000-0000-000000000000""
    },
    ""86ccdsbf-e7ad-4851-93ff-6ec817469c1e"": {
    ""serviceId"": ""00000000-0000-0000-0000-000000000000""
    }
}";

    var result = JsonConvert.DeserializeObject<Dictionary<string, Service>>(json);

    foreach (var pair in result)
    {
        Console.WriteLine("Key: " + pair.Key + " ServiceId: " + pair.Value.ServiceId);
    }
}
static void Main()
{
字符串json=@”
{
“0fea8f8a-4169-495d-8307-50bc333fd87d”:{
“服务ID”:“4cb9125a-1eaa-4bd4-a473-CFCCE0F3C63”
},
“0564d078-94f5-4f97-8398-b9f58a51f70b”:{
“服务ID”:“00000000-0000-0000-0000-00000000”
},
“f9a165d2-967d-4733-8599-1074270dae2e”:{
“服务ID”:“00000000-0000-0000-0000-00000000”
},
“86ccdsbf-e7ad-4851-93ff-6ec817469c1e”:{
“服务ID”:“00000000-0000-0000-0000-00000000”
}
}";
var result=JsonConvert.DeserializeObject(json);
foreach(结果中的var对)
{
Console.WriteLine(“Key:+pair.Key+”ServiceId:+pair.Value.ServiceId);
}
}

哦,哇,这真是太好了。比创建自定义反序列化程序更简单、更简洁。非常感谢。