Serialisieren und Deserialisieren von TimeSpan-Werten für eine property vom Typ Object
Habe ich eine Klasse, die ein Feld vom Typ Object enthalten können, ein TimeSpan-Objekt.
Ich bin serialisieren dies und das Deserialisieren:
public class MyObject
{
public object myTimeSpan { get; set; }
}
...
var myObject = new MyObject { myTimeSpan = TimeSpan.FromDays(2) };
var json = JsonConvert.SerializeObject(myObject);
...
var duplicateObject = JsonConvert.DeserializeObject<MyObject>(json);
Und wenn ich es Tue, duplicateObject.myTimeSpan enthält den string "2:00:00".
Wie kann ich diese zu Deserialisieren in eine TimeSpan-Objekt?
Zwei Punkte:
- Ich bin nicht der Umgang mit strings serialisiert wurden irgendwo sonst. Die Streicher nur ich werde Deserialisieren von strings, die ich serialisiert.
- Das Feld hat den Typ " Objekt - es kann eine Zeichenfolge enthalten, oder ein DateTime-Wert, oder es kann enthalten, eine Zeitspanne. Derzeit, es ist nur die Zeitspanne an, ich habe Probleme mit.
Dein code scheint unvollständig. Was ist 'selectionCriteria' Sie sind eigentlich serialisieren?
Ich nehme an, du meintest
Sorry. Cut-and-paste-Fehler behoben.
Ich bekomme nicht ein TimeSpan-Objekt, wenn das zugrunde liegende Feld ist vom Typ object.
Möglicherweise müssen Sie implementieren eine benutzerdefinierte
Ich nehme an, du meintest
var json = JsonConvert.SerializeObject(myObject);
. Wenn ich das mache, bekomme ich die JSON -{"myTimeSpan":"2.00:00:00"}
, und das duplizierte Objekt hat einen 2-Tage-Zeitspanne.Sorry. Cut-and-paste-Fehler behoben.
Ich bekomme nicht ein TimeSpan-Objekt, wenn das zugrunde liegende Feld ist vom Typ object.
Möglicherweise müssen Sie implementieren eine benutzerdefinierte
JsonConverter
können versuchen, analysieren die string-Darstellung des TimeSpan
wieder in eine tatsächliche TimeSpan
Objekt.InformationsquelleAutor Jeff Dege | 2014-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Json.Net hat ein
TypeNameHandling
Einstellung für den Umgang mit unbekannten Arten, so dass Sie korrekt deserialisiert werden kann. Wenn diese Einstellung eingeschaltet ist, verursacht es Json.Net zum einfügen von speziellen$type
Eigenschaften in den JSON, die dann als Hinweise, wenn Deserialisieren. Leider, diese Einstellung scheint nicht zu funktionieren, mit "einfachen" Typen wieTimeSpan
, da Ihre Werte serialisiert als String sondern als Objekte.Um dieses Problem zu umgehen, würde ich vorschlagen, machen Sie eine benutzerdefinierte
JsonConverter
verwendet die gleiche Idee. Anstelle der Ausgabe der string-Wert des Objekts direkt, der Konverter würde die Ausgabe ein sub-Objekt-Darstellung mit zwei Eigenschaften:type
undvalue
. Dietype
Eigenschaft der sub-Objekt enthält die assembly qualifizierten Typnamen für das Objekt, während dievalue
Eigenschaft enthält die eigentliche serialisierten Wert. Auf der Deserialisierung wird der Konverter würde michtype
Eigenschaft, um zu wissen, welche Art von Objekt zu instanziieren, von der value-Eigenschaft. Das schöne an diesem Ansatz ist, dass Sie nicht haben, um zusätzliche Eigenschaften oder Logik Ihrer model-Klasse(N).Hier ist, wie es Aussehen könnte, in code:
Um den Konverter verwenden, nur schmücken Sie jede
object
Eigenschaften in Ihren Klassen, die brauchen eine spezielle Behandlung mit einem[JsonConverter]
- Attribut wie dieses:Hier ist ein round-trip-demo, die zeigt, wie das funktionieren kann für mehrere verschiedene Arten.
Hier ist die Ausgabe:
InformationsquelleAutor Brian Rogers