【问题标题】:Deserializing JSON into a C# class with dynamic field names将 JSON 反序列化为具有动态字段名称的 C# 类
【发布时间】:2020-06-17 16:33:08
【问题描述】:

我的问题与this one 非常相似。我尝试调整他们的解决方案以满足我的需求,但似乎无法为我的 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<KeyValuePair<string, string>>,基本上是<Id_1, Id_2> 的列表,但我对替代方案持开放态度。

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

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>[]);
    }
}

我在这里称它为: var response = JsonConvert.DeserializeObject&lt;PolicyMetadata&gt;(content); 但这会导致 null 值,所以我肯定做错了什么。我尝试在整个 ReadJson 方法中放置断点和打印语句,但它们从未被触发,所以我不确定该代码是否真的在运行。

【问题讨论】:

    标签: c# .net json deserialization


    【解决方案1】:

    型号:

    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);
        }
    }
    

    【讨论】:

    • 哇哦,效果很好。比创建自定义反序列化器更简单、更干净。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多