Überschreibe das von json.Marshal verwendete Layout, um time.Time zu formatieren

7

Gibt es in Golang eine Möglichkeit, den generischen encoding/json Marshal dazu zu bringen, beim Marshalling der time.Time -Felder ein anderes Layout zu verwenden?

Grundsätzlich habe ich diese Struktur:

%Vor%

und ich möchte mit encdoding/json 's Marshal -Funktion in json codieren, aber ich möchte mein benutzerdefiniertes Layout verwenden, ich stelle mir vor, dass time.Format(layout) aufgerufen wird, ich möchte dieses Layout steuern,

    
Ali 09.12.2013, 16:16
quelle

3 Antworten

10

Wie von zeebo's Antwort inspiriert und in den Kommentaren zu dieser Antwort herausgearbeitet:

Ссылка

%Vor%

Diese Lösung bettet die time.Time in die jsonTime-Struktur ein. Die Einbettung fördert die gesamte Zeit. Die Methoden von Time zur jsonTime-Struktur, die ihre Verwendung ohne explizite Typkonvertierung ermöglicht (siehe // 1).

Das Einbetten einer time.Time hat den Nachteil, dass sie auch die MarshalJSON-Methode unterstützt, die aus Gründen der Abwärtskompatibilität den Code für die Codierung / json marshalling höher priorisiert als die MarshalText-Methode (MarshalText wurde in Go 1.2 hinzugefügt , MarshalJSON ist älter als das). Daher wird das standardmäßige time.Time-Format anstelle eines von MarshalText bereitgestellten benutzerdefinierten Formats verwendet.

Um dieses Problem zu überwinden, überschreiben wir MarshalJSON für die jsonTime-Struktur.

    
ChrisH 11.12.2013, 05:02
quelle
6

Vielleicht wird so etwas für Sie funktionieren?

%Vor%

auch hier verfügbar: Ссылка

Erstellen Sie einfach einen benutzerdefinierten Typ, der MarshalText so implementiert, wie Sie es möchten.

    
zeebo 09.12.2013 16:53
quelle
3

Erstens empfehle ich dringend, ein anderes Zeitformat als das Standard-RFC3339 zu verwenden. Es ist ein gutes Zeitformat und kann von jeder Anzahl von Sprachen analysiert werden. Wenn Sie also kein anderes Format benötigen, weil die API eines anderen benötigt, ist es wahrscheinlich das Beste, den Standard zu verwenden.

Aber ich musste dieses Problem lösen, indem ich die APIs anderer Leute konsumierte. Hier ist eine Lösung, die den Großteil der Arbeit in den Marshal / Unmarshal-Schritt verlagert und eine ideale Struktur hinterlässt: Ссылка

    
jessecarl 10.12.2013 16:17
quelle

Tags und Links