Пользовательский Json. Net конвертер со списком <Dynamic> - PullRequest
0 голосов
/ 26 мая 2020

В моем проекте ASP. Net Core API у меня есть класс, который я десериализую с помощью настраиваемого конвертера в Списке значений Dynami c:

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

Как, в моем конвертере , могу ли я увидеть, является ли объект Dynami c DateTimeOffset, а затем, если да, добавить Год к значению перед десериализацией?

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

1 Ответ

0 голосов
/ 27 мая 2020

Если вы добавляете настраиваемый AddYearJsonConverter в поле Value , вы должны вернуть тот же тип Value в методе ReadJson класса AddYearJsonConverter.

Затем загрузите средство чтения через JToken, перебирая каждое значение поля в токене, оно принудительно преобразуется в тип 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)
        {
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...