如何在C#中用动态和静态键名反序列化JSON [英] How to deserialize JSON with dynamic and static key names in C#

查看:0
本文介绍了如何在C#中用动态和静态键名反序列化JSON的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须反序列化来自具有以下结构的API的响应:

[
  {
    "starttime": "...",
    "endtime": "....",
    "var1": {},
    "var2": {}
  },
  {
    "starttime": "...",
    "endtime": "....",
    "var1": {},
    "var3": {}
  },
  {
    "starttime": "...",
    "endtime": "....",
    "var1": {}
  }
] 

一些见解:

  • JSON是一个对象数组
  • 数组中的每个对象都将始终具有"starttime"和"endTime"属性
  • 对象"var1"、"var2"、"var3"在其内部将始终具有相同的属性...但问题是对象键(var1、var2或var3)是动态的。它可以是任何字符串,而且这种对象的数量是动态的(我可以有3个或零个"var"对象)。

我的想法是这样的:将JSON字符串反序列化为一个具有属性"starttime"、"endTime"的对象列表和一个包含所有"var"对象的字典。

public class MyResponse
{
    [JsonProperty(PropertyName = "starttime")]
    public string StartTime { get; set; }
    [JsonProperty(PropertyName = "endtime")]
    public string EndTime { get; set; }
    public Dictionary<string, VarObject> VarData { get; set; }
}

但VarData属性始终为空。

有人尝试过这样的东西吗?

推荐答案

您有两个选择,第一个是直接反序列化为List<Dictionary<string, object>>,例如:

var responses = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(json);

或者,如果您坚持使用对象,则需要编写一个自定义转换器。例如,如下所示:

public class MyResponseConverter : JsonConverter
{
    public override bool CanConvert(Type type) => type == typeof(MyResponse);

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var responseObject = JObject.Load(reader);

        MyResponse response = new MyResponse
        {
            StartTime = (string)responseObject["starttime"],
            EndTime = (string)responseObject["endtime"],
        };

        var varData = new Dictionary<string, object>();

        foreach (var property in responseObject.Properties())
        {
            if(property.Name == "starttime" || property.Name == "endtime")
            {
                continue;
            }

            varData.Add(property.Name, property.Value);
        }

        response.VarData = varData;
        return response;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // If you want to write to JSON, you will need to implement this method
        throw new NotImplementedException();
    }
}

您的类将稍微更改为:

[JsonConverter(typeof(MyResponseConverter))]
public class MyResponse
{
    [JsonProperty(PropertyName = "starttime")]
    public string StartTime { get; set; }
    [JsonProperty(PropertyName = "endtime")]
    public string EndTime { get; set; }

    public Dictionary<string, object> VarData { get; set; }
}

现在您可以这样反序列化:

var responses = JsonConvert.DeserializeObject<List<MyResponse>>(json);

这篇关于如何在C#中用动态和静态键名反序列化JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆