Jak deserializować daty json z innego formatu

0

Witajcie. API zewnętrznej firmy przesyła mi co jakiś czas różne raporty. Jedną z danych są daty zapisane w formacie:
27/01/2022 09:30 AM
Niestety otrzymuję błąd parsowania daty. Z tego co potestowałem to format na jaki próbuje zdeserializować to MM/dd/yyyy. macie pomysł jak to można poprawić, aby nie nabrudzić za bardzo w kodzie?

Używam do deserializacji Newtonsoft.json

0

Z pomocą google udało mi się zrobić konwerter json i póki co wygląda na to, że spełnia moje oczekiwania. Powiedzcie, czy to dobre rozwiązanie:

public class MultiFormatDateConverter : JsonConverter
        {
            public List<string> DateTimeFormats { get; set; }

            public override bool CanConvert(Type objectType)
            {
                return objectType == typeof(DateTime) || objectType == typeof(DateTime?);
            }

            public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
            {
                string dateString = (string)reader.Value;
                if (dateString == null)
                {
                    if (objectType == typeof(DateTime?))
                        return null;

                    throw new JsonException("Unable to parse null as a date.");
                }
                DateTime date;
                foreach (string format in DateTimeFormats)
                {
                    if (DateTime.TryParseExact(dateString, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
                        return date;
                }
                throw new JsonException("Unable to parse \"" + dateString + "\" as a date.");
            }

            public override bool CanWrite
            {
                get { return false; }
            }

            public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
            {
                throw new NotImplementedException();
            }
        }
var settings = new JsonSerializerSettings();
                settings.DateParseHandling = DateParseHandling.None;
                settings.Converters.Add(new MultiFormatDateConverter
                {
                    DateTimeFormats = DataFormatsJson.ToList()
                });
                ExternalDataModel model = JsonConvert.DeserializeObject<ExternalDataModel>(body, settings);
2

Jeśli to jest wykorzystywane tylko w tym modelu to bym wrzucił przez atrybut converter tam, gdzie jest to konieczne, a w przeciwnym wypadku korzystał ze standardowego. Wtedy byłoby jasne, że mamy jakiś przypadek specyficznie formatowanej daty i chcemy to obsłużyć. I nie trzeba by przekazywać serializer settings.

W każdym razie jeśli spełnia oczekiwania i przetestowałeś, ze dziala to trudno mówić o niepoprawności.

0

Sprawdziłem jeszcze raz Twoją odpowiedź i teraz rozumiem. Mój sposób zmieni sposób konwersji wszystkich pól, a Twój tylko pola które oznaczę atrybutem. Akurat wszystkie pola z datą są w tym formacie więc pozostanę przy obecnym sposobie, ale Twój konwerter też się przyda na przyszłość. Dziękuję !!!!!!!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1