2017-11-15 4 views
1

Ich versuche, ein JSON zu deserialisieren, das Daten im Format 2017-10-26 13:32:11 Etc/GMT enthält. NodaTime scheint dies zu unterstützen, wenn es mit Json.NET und NodaTime.Serialization.JsonNet kombiniert wird. Ich fand hier einige Informationen über die Stackoverflow mir diese Arbeit erhalten hat, nur NodaTime mit:NodaTime.Serialization.JsonNet mit einem benutzerdefinierten Datumsformat arbeiten

var date = "2017-10-26 13:32:11 Etc/GMT"; 

var pattern = ZonedDateTimePattern.CreateWithInvariantCulture(
    "yyyy'-'MM'-'dd HH':'mm':'ss z", 
    DateTimeZoneProviders.Tzdb 
); 

var result = pattern.Parse(date); 

jedoch bei diesem Beispiel erstreckt sich in eine JSON Deserialisieren die beiden anderen Pakete verwendet wird, kann ich nicht bekommen sie zu arbeiten. Aus der Lektüre der Dokumentation und anderen Ressourcen, ich glaube, dies funktionieren soll:

public class DateObj 
{ 
    public ZonedDateTime Date { get; set; } 
} 

void Main() 
{ 
    var date = "2017-10-26 13:32:11 Etc/GMT"; 
    var json = $"{{\"Date\": \"{date}\"}}"; 

    var pattern = ZonedDateTimePattern.CreateWithInvariantCulture(
     "yyyy-MM-dd HH:mm:ss z", 
     DateTimeZoneProviders.Serialization 
    ); 

    var settings = new JsonSerializerSettings(); 
    settings.ConfigureForNodaTime(pattern.ZoneProvider); 
    var dateObj = JsonConvert.DeserializeObject<DateObj>(json, settings); 
} 

Aber es löst eine Ausnahme in der letzten Zeile sagt The value string does not match a quoted string in the pattern. Value being parsed: '2017-10-26^ 13:32:11 Etc/GMT'. (^ indicates error position.). Was mache ich falsch?

+0

Haben Sie 'DateTimeOffset' statt der Noda Zeit' Typ OffsetDateTime' verwenden? Im Allgemeinen ist das Leben einfacher, wenn Sie sich vollständig an Noda Time Typen halten können. –

+0

Nein, ich kann jeden Typ verwenden, aber es gibt keinen großen Unterschied, ich bekomme nur einen anderen Fehler; 'Die Wertzeichenfolge stimmt nicht mit einer Zeichenfolge in Anführungszeichen im Muster überein. Wert wird geparst: '2017-10-26^13:32:11 Etc/GMT'. (^ zeigt die Fehlerposition an.) '. Versucht mit ein paar verschiedenen Varianten des Musters, ohne '' 'etc, und mit ein paar verschiedenen Typen, 'OffsetDateTime' und' ZonedDateTime', aber der Fehler ist gleich geblieben. – TheQ

+0

Wenn Sie den Wert "ZonedDateTime" festlegen möchten, sollten Sie in der Lage sein, ihn zum Laufen zu bringen. (Als ich "OffsetDateTime" vorgeschlagen hatte, hatte ich nicht bemerkt, dass Ihr Wert tatsächlich eine Zeitzone und keinen Offset enthält.) Im Moment geht es nicht um diesen Ansatz - es wäre wahrscheinlich sinnvoll, entweder Ihre aktuelle Antwort zu löschen und Ändern Sie die Frage zu "Getting NodaTime.Serialization.JsonNet mit einem benutzerdefinierten Format arbeiten" oder Erstellen einer neuen Frage dafür. Ich möchte auf jeden Fall helfen, aber ... –

Antwort

2

Derzeit erstellen Sie ein bestimmtes ZonedDateTime Muster - aber Sie sagen Json.NET nicht wirklich über dieses Muster irgendwo.

Wenn dies der ist nur Noda Zeittyp, den Sie verwenden müssen, würde ich empfehlen, dass Sie nicht ConfigureForNodaTime überhaupt nennen - denn das wird einen ZonedDateTime Konverter mit dem falschen Muster konfiguriert. Wir haben code internal to NodaTime.Serialization.JsonNet einen Konverter zu ersetzen, aber das ist im Moment nicht ausgesetzt. (Vielleicht sollten wir das tun ...)

Es ist einfach nur wenn eine einzige Konverter zu erstellen und konfigurieren Sie die Einstellungen für das:

var settings = new JsonSerializerSettings 
{ 
    DateParseHandling = DateParseHandling.None, 
    Converters = { new NodaPatternConverter<ZonedDateTime>(pattern) } 
}; 

Hier ist, wie das aussieht im Zusammenhang mit einem vollen Programm . Beachten Sie, dass ich ausdrücklich DateTimeZoneProviders.Tzdb hier bin mit, anstatt DateTimeZoneProviders.Serialization, da Sie haben definitiv TZDB Identifikatoren:

using Newtonsoft.Json; 
using NodaTime; 
using NodaTime.Serialization.JsonNet; 
using NodaTime.Text; 
using System; 

public class DateObj 
{ 
    public ZonedDateTime Date { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
     var date = "2017-10-26 13:32:11 Etc/GMT"; 
     var json = $"{{\"Date\": \"{date}\"}}"; 

     var pattern = ZonedDateTimePattern.CreateWithInvariantCulture(
      "yyyy-MM-dd HH:mm:ss z", 
      DateTimeZoneProviders.Tzdb 
     ); 

     var settings = new JsonSerializerSettings 
     { 
      DateParseHandling = DateParseHandling.None, 
      Converters = { new NodaPatternConverter<ZonedDateTime>(pattern) } 
     }; 
     var dateObj = JsonConvert.DeserializeObject<DateObj>(json, settings); 
     Console.WriteLine(dateObj.Date); 
    } 
} 
+0

Cool, das hat wie ein Zauber funktioniert! Vielen Dank :) – TheQ

Verwandte Themen