首页 > 解决方案 > 带有列表的自定义 Json.Net 转换器

问题描述

在我的 ASP.Net Core API 项目中,我有一个使用动态值列表上的自定义转换器反序列化的类:

    [JsonConverter(typeof(AddYearJsonConverter ))]
    public List<dynamic> Value { get; set; }

如何在我的转换器中查看动态对象是否为 DateTimeOffset,如果是,则在反序列化之前将 Year 添加到值中?

public class AddYearJsonConverter : JsonConverter<DateTimeOffset?>
{
    public override DateTimeOffset? ReadJson(JsonReader reader, Type objectType, DateTimeOffset? existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        // ?? How to check type and add a year??
        JObject obj = JObject.Load(reader);
        return serializer.Deserialize<DateTimeOffset?>(reader);
    }

标签: asp.net-corejson.net

解决方案


如果AddYearJsonConverter要在Value字段中添加自定义,则应在AddYearJsonConverter的方法中返回相同类型的 Value 。ReadJson

然后通过 加载 reader JToken,通过循环遍历 token 中的每个字段值,强制转换为DateTimeOffset类型。如果成功,则相应日期增加一年,否则无需更改。

这是代码:

   public class AddYearJsonConverter : JsonConverter<List<dynamic>>
    {
        public override List<dynamic> ReadJson(JsonReader reader, Type objectType, List<dynamic> existingValue, bool hasExistingValue, JsonSerializer serializer)
        {
            JToken token = JToken.Load(reader);
            List<dynamic> data = new List<dynamic>();
            foreach (var Value in token)
            {
                try
                {
                    DateTimeOffset dto = DateTimeOffset.Parse(Value.ToString()).AddYears(1);
                    data.Add(dto);
                }
                catch
                {
                    data.Add(Value);
                }

            }
            return data;
        }
        public override void WriteJson(JsonWriter writer, List<dynamic> value, JsonSerializer serializer)
        {
        }

    }

推荐阅读