Ich entwickle eine API, um einige Daten mithilfe der ASP.NET-Web-API verfügbar zu machen.
In einer der APIs möchte der Client, dass wir das Datum im yyyy-MM-dd
Format verfügbar machen. Ich möchte die globalen Einstellungen (z. B. GlobalConfiguration.Configuration.Formatters.JsonFormatter
) dafür nicht ändern , da sie für diesen Client sehr spezifisch sind. Und das entwickle ich in einer Lösung für mehrere Kunden.
Eine der Lösungen, an die ich denken könnte, besteht darin, eine benutzerdefinierte zu erstellen JsonConverter
und diese dann in die Eigenschaft einzufügen, die ich für die benutzerdefinierte Formatierung benötige
z.B
class ReturnObjectA
{
[JsonConverter(typeof(CustomDateTimeConverter))]
public DateTime ReturnDate { get;set;}
}
Ich frage mich nur, ob es einen anderen einfachen Weg gibt, dies zu tun.
c#
datetime
asp.net-web-api
json.net
Bleib dumm
quelle
quelle
Antworten:
Du bist auf dem richtigen Weg. Da Sie sagten, dass Sie die globalen Einstellungen nicht ändern können, ist es am besten, das
JsonConverter
Attribut nach Bedarf anzuwenden , wie Sie vorgeschlagen haben. Es stellt sich heraus, dass Json.Net bereits über eine integrierte Funktion verfügtIsoDateTimeConverter
, mit der Sie das Datumsformat festlegen können. Leider können Sie das Format nicht über dasJsonConverter
Attribut festlegen , da das einzige Argument des Attributs ein Typ ist. Es gibt jedoch eine einfache Lösung: Unterklasse dieIsoDateTimeConverter
, dann geben Sie das Datumsformat im Konstruktor der Unterklasse an. Wenden Sie dasJsonConverter
Attribut bei Bedarf an und geben Sie Ihren benutzerdefinierten Konverter an. Hier ist der gesamte benötigte Code:Wenn es Ihnen nichts ausmacht, auch dort Zeit zu haben, müssen Sie den IsoDateTimeConverter nicht einmal in Unterklassen unterteilen. Das Standard-Datumsformat ist
yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK
(wie im Quellcode zu sehen ).quelle
IsonDateTimeConverter
wurde jedoch direkt aus dem Json.Net-Quellcode übernommen . Deshalb werde ich Ihre Bearbeitung darauf zurücksetzen.Sie könnten diesen Ansatz verwenden:
Und benutze es so:
Die DateTimeFormat-Zeichenfolge verwendet die hier beschriebene Zeichenfolgensyntax im .NET-Format: https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings
quelle
'JsonConverterAttribute' does not contain a constructor that takes 2 arguments
'JsonConverterAttribute' does not contain a constructor that takes 2 arguments
angezeigt wird, bedeutet dies, dass Ihre Version von json.net zu alt ist. Sie müssen auf die neueste json.net-Version aktualisieren.Dies kann auch mit einer
IsoDateTimeConverter
Instanz erfolgen, ohne die globalen Formatierungseinstellungen zu ändern:Dies verwendet die
JsonConvert.SerializeObject
Überladung, die einparams JsonConverter[]
Argument benötigt.quelle
Auch verfügbar mit einer der Überladungen der Serializer-Einstellungen:
Oder
Überladungen, die einen Typ annehmen, sind ebenfalls verfügbar.
quelle
yyyy-MM-ddTHH:mm:ssZ
... 24 Stunden im Uhrzeigersinn.Erstellen Sie eine Hilfsklasse und wenden Sie sie auf Ihr Eigenschaftsattribut an
Hilfsklasse:
Ihr Code verwendet wie folgt:
quelle
Es gibt eine andere Lösung, die ich verwendet habe. Erstellen Sie einfach eine Zeichenfolgeeigenschaft und verwenden Sie sie für json. Diese Eigenschaft wird das Datum korrekt formatiert zurückgeben.
Auf diese Weise müssen Sie keine zusätzlichen Klassen erstellen. Außerdem können Sie verschiedene Datenformate erstellen. Sie können beispielsweise ganz einfach eine andere Eigenschaft für die Stunde mit derselben DateTime erstellen.
quelle
Manchmal funktioniert das Dekorieren des json convert-Attributs nicht. Ausnahmsweise wird angegeben, dass " 2010-10-01" ein gültiges Datum ist . Um diese Typen zu vermeiden, habe ich das json convert-Attribut für die Eigenschaft entfernt und in der deserilizedObject-Methode wie unten erwähnt erwähnt.
quelle
Mit unterem Konverter
Kann mit einem benutzerdefinierten Standardformat verwendet werden
Oder ein bestimmtes Format für eine Eigenschaft
quelle