2014-09-17 10 views
5

Muszę zastąpić serializację DateTime dla JSON w WCF REST Self Hosted. Teraz używam czegoś podobnego do tego kodu, ale to zdecydowanie nie jest droga, ponieważ wymaga manipulowania każdą klasą.Zmiana serializacji json DateTime w WCF 4.0 Usługa REST

[DataContract] 
public class Test 
{ 
    [IgnoreDataMember] 
    public DateTime StartDate; 

    [DataMember(Name = "StartDate")] 
    public string StartDateStr 
    { 
     get { return DateUtil.DateToStr(StartDate); } 
     set { StartDate = DateTime.Parse(value); } 
    } 
} 

gdzie moja funkcja użyteczna DateUtil.DateToStr wykonuje wszystkie operacje formatowania.

Czy jest jakiś łatwy sposób to zrobić bez dotykania atrybuty na moich klasach, które mają atrybut DataContract? W idealnej sytuacji nie byłoby żadnych atrybutów, ale kilka linii kodu w mojej konfiguracji, aby zastąpić serializator, z którego nadpisałem serializację DateTime.

Wszystko, co znalazłem, wygląda tak, że muszę wymienić ogromne części rurociągu.

Ten artykuł nie wydaje się mieć zastosowania, ponieważ w używam WebServiceHost nie HttpServiceHost, który nie jest częścią 4.5.1 Framework.

JSON.NET Serializer for WCF REST Services

Odpowiedz

1

Mam nadzieję, że również próbował messageformatter w WCF. Ponieważ jest to długie wytłumaczenie, przekazuję link do tego artykułu.

http://blogs.msdn.com/b/carlosfigueira/archive/2011/05/03/wcf-extensibility-message-formatters.aspx

+2

Czytałem ten artykuł. Mówi o tym, jak wymienić formatyzator. Nie chcę go zastąpić, chcę ustawić domyślną DateTimeFormat na serializatorze json używanym z WebServiceHost i webHttpBehavior. Patrząc na kod referencyjny WCF, wydaje się, że WebOperationContract angażuje się w tworzenie formaterów. – bpeikes

1

Jest to ograniczenie w JSON do konwersji DateTime, specjalnie w zależności od przypadku.

proszę zobaczyć http://msdn.microsoft.com/en-us/library/bb412170(v=vs.110).aspx i przeczytać rozdział Dates/Times and JSON

Aby rozwiązać ten problem, po prostu zmienił rodzaj serializacji z JSON do XML dla wszystkich połączeń w tym DateTime.

+0

Spojrzałem na źródło odniesienia dla serializatora json WCF i ma on właściwość o nazwie DateTimeFormat, ale nie mogę dowiedzieć się, jak to zmienić. Pisałem również na forum MSDN, ale nikt nie wie, jak uzyskać do niego dostęp. Artykuł, do którego linkujesz, nie mówi, że nie jest to możliwe, ani nie mówi, że istnieje ograniczenie. Mówi tylko o domyślnym formacie. – bpeikes

+0

@bpeikes istnieje ograniczenie. Zapomniałem dokładnego linku, w którym zobaczyłem szczegóły dotyczące ograniczeń, ale czy próbowałeś XML? Będzie działał dobrze z XML. Zobacz także, jak dane są serializowane w JSON, coś jak/DATE (7002340200 + 3000)/ –

+0

@bpeikes Proszę przejść przez następujące dwa łącza: http://stackoverflow.com/questions/10302902/can-you-tell-json -net-to-serialize-datetime-as-utc-even-if-unspecified http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx –

0

Po długich dyskusjach, znalazłem rozwiązanie dla niego. Należy użyć następującego kodu, aby rozwiązać zserializowaną datę.

`[IgnoreDataMember] public DateTime? PerformanceDate {get; zestaw; }

[DataMember(EmitDefaultValue = false, Name = "PerformanceDate")] 
    public string UpdateStartDateStr 
    { 
     get 
     { 
      if (this.PerformanceDate.HasValue) 
       return this.PerformanceDate.Value.ToUniversalTime().ToString("s", CultureInfo.InvariantCulture); 
      else 
       return null; 
     } 
     set 
     { 
      // should implement this... 
     } 
    }` 
+0

Twoje rozwiązanie jest dokładnie tym, co zaproponowałem w pytaniu. – bpeikes