2013-02-28 10 views
6

Zur Zeit habe ich eine Klasse, die etwa wie folgt aussieht:Wie kann ich die JSON-Serialisierung anpassen?

public class TestSerilizer 
{ 
    public int IntValue; 
    public DateTime DTValue; 
} 

und einen Controller, der diese Klasse serialisiert JSON zurückgibt, die etwa wie folgt aussieht:

public ActionResult TestJson() 
{ 
    TestSerilizer testDT = new TestSerilizer(); 
    return Json(testDT); 
} 

Es ist bekannt, dass diese produziert ein Datum, das ungefähr so ​​aussieht wie /Date(123456)/ im JSON, was weniger als wünschenswert ist. Für meine Zwecke möchte ich in der Lage sein, ein Attribut hinzuzufügen, das meine Daten so formatiert, dass sie für meine Sicht sinnvoll sind. Im Idealfall würde Ich mag meine Ansicht Modell ändern etwas wie folgt aussehen:

public class TestSerilizer 
{ 
    public int IntValue; 
    [JSONDateFormatter("hh:mm tt")] 
    public DateTime DTValue; 
} 

, die eine JSON-Daten mit dem formatierten Datum erzeugen würde. Gibt es eine Möglichkeit, die JSON-Serialisierung zu entführen, um so etwas zu tun? Es sollte angemerkt werden, dass dies eine große Codebasis ist, die sowohl diese implizite JSON-Serialisierung als auch die explizite Verwendung der JavaScriptSerializer-Klasse aufweist. Daher würde ich eine Methode bevorzugen, die für beide Situationen funktioniert, aber ich verstehe, dass dies möglicherweise nicht möglich ist.

+0

Termine sind besonders Tuff in json zu bekommen. Ich behandle sie normalerweise als Zeichenfolgen und versuche, sie so zu senden, dass JavaScript sie nicht zu interpretieren oder zu verwalten versucht. –

Antwort

7

Dies ist im Allgemeinen wie ich Serialisierung von Daten für meine Objekte verwalten. Beachten Sie, dass diese Eigenschaften Datamember verwendet, weil es sowohl von binären und json sein serializable benötigt:

[DataContract] 
[Serializable] 
public class YourClass 
{ 
     [DataMember] 
     private long timeStampLong; 


     [IgnoreDataMember] 
     public DateTime TimeStamp 
     { 
      get { return new DateTime(timeStampLong); } 
      set { timeStampLong = value.Ticks; } 
     } 
} 

Nun dies nicht der Datetime als lesbar in json machen können, aber es wird es konsistent machen. Verschiedene json-Bibliotheken handhaben das Serialisieren von Datetime unterschiedlich, so dass Sie in der Lage sein möchten, sie alle auf die gleiche Weise zu serialisieren.

Bearbeiten: Beachten Sie, dass dies keine zweite Eigenschaft im Sinne von C# -Eigenschaften ist, sondern nur das zugrunde liegende Feld für die Eigenschaft. Sie könnten stattdessen das zugrunde liegende Feld zu einer Zeichenfolge machen, und dieses zugrunde liegende Feld wird niemals außerhalb des Objekts angezeigt. Wegen der IgnoreDataMember wird auch immer nur ein einzelner Wert serialisiert.

Edit2: Klassendeklaration für eine vollständigere Antwort hinzugefügt, wenn jemand dies implementieren muss.

Edit: Für ein vollständigeres Beispiel dachte ich, dass ich die andere Option beinhalten würde ich verwendet habe (mit einem String als Trägerfeld)

/// <summary> 
    /// Representations of the TimeStamp used for serialization 
    /// </summary> 
    [DataMember(Name = "TimeStamp")] 
    private String timeStamp; 

    /// <summary> 
    /// timestamp when the request is sent 
    /// </summary> 
    [IgnoreDataMember] 
    public DateTime TimeStamp 
    { 
     get { return DateTime.Parse(timeStamp, null, DateTimeStyles.RoundtripKind); } 
     set { timeStamp = value.ToUniversalTime().ToString("o"); } 
    } 
+0

das ist glatt ... muss versuchen, dass –

+1

Wir haben ein System, das mehrere json-Bibliotheken unterstützen muss (wie wir) Ich weiß nicht, was unser Client verwenden wird. Auf diese Weise ist es egal, ob Sie den .net Serializer oder Newtonsoft oder einen anderen JSON Serializer verwenden, es serialisiert immer nur den langen Wert. – jzworkman

+0

Ich hatte gehofft, eine zweite Eigenschaft zu vermeiden, aber es sieht mehr und mehr wie das wird nicht möglich sein. – Mykroft

0

Wie @jzworkman wies darauf hin, die Technik Umriss in dieser Antwort So steuern Sie, wie der interne DateTime-Wert serialisiert wird. Ich bleibe dabei, immer ein string-basiertes Format zu verwenden, das von fast allem anderen zuverlässig analysiert werden kann. Wenn es mir möglich ist, halte ich mich an das ISO 8601-Format, das mit der Zeitzonenzuordnung umgehen kann. In C# können Sie myDateTimeValue.ToString ("o") verwenden, um die Zeichenfolge für den Datetime in ISO 8601.

Wikipedia article on ISO 8601

Verwandte Themen