Przeszukałem sieć, aby uzyskać informacje na ten temat, ale większość wyników dotyczy tworzenia usług WCF lub sytuacji, w których usługa jest pod Twoją kontrolą.Klient WCF w jaki sposób można deserializować niezgodny format daty z odpowiedzi JSON?
Buduję proxy klienta WCF dla usługi RESTful JSON, która jest poza moją kontrolą. Korzystam z podstawowego wzorca ServiceContract/DataContract i próbuję pozwolić ramie wykonać jak najwięcej pracy, jak to możliwe.
Przeważnie działa to dobrze, ale wszystkie pola datetime pochodzące z tej usługi zewnętrznej są w określonym formacie, np.
{"SomeObject":
{"details":"blue and round", "lastmodified":"2013/01/02 23:14:55 +0000"}
}
Więc pojawia się błąd:
There was an error deserializing the object of type MyNamespace.SomeObject. DateTime content '2013/01/02 23:14:55 +0000' does not start with '/Date(' and end with ')/' as required for JSON.'.
Moja DataContract brzmi:
namespace Marshmallow.WebServices.ServiceModels
{
[DataContract]
public class SomeObject
{
[DataMember(Name = "details")]
public string Details { get; set; }
[DataMember(Name = "lastmodified")]
public DateTime LastModified { get; set; }
}
}
Moja ServiceContract brzmi:
[ServiceContract]
public interface ICoolExternalApi
{
[OperationContract]
[WebGet(UriTemplate = "/something.json",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped)]
[return: MessageParameter(Name = "SomeObject")]
SomeObject GetAccount();
}
Co chcę wiedzieć, gdzie mogę wbić trochę dorsza e, aby zdefiniować, w jaki sposób WCF powinno deserializować ostatnio zmodyfikowane pole (uczynić obiekt DateTime poza ciągiem znaków)?
Albo jeszcze lepiej, zdefiniuj sposób deserializacji wszystkich modułów DataTime DataMembers dla wszystkich moich umów danych. Nie chcę wielu powtarzających się kodów.
Nie chcę też uciekać się do jakiegoś zewnętrznego deserializera, ani nie chcę zaczynać od umieszczania wszystkiego przez niestandardową metodę deserializacji, jeśli można tego uniknąć.
Deserializacja na łańcuch ma swoje ograniczenia, które zauważyliście. To zadziała, ale daleko mu do elegancji. Konfigurowanie IDispatchMessageInspector to trochę więcej wysiłku, ale powinno być czystsze. –
Mam ochotę używać IDispatchMessageInspector nie jest tak elegancko. A) Regex jest powolny i niezbyt skalowalny. B) Jest to dodatkowa analiza całego ciała JSONA. C) Musiałbym zamienić łańcuchy datetime na "ten" format "\/Date (1297293089984-0800) \ /", który następnie zostałby ponownie przeanalizowany w celu uzupełnienia danych DataMember (podwójne przetwarzanie). D) To jest hack. Z pewnością musi istnieć inna funkcja WCF, której nie rozumiem (OnDeserializing czy coś takiego?), Która ma na celu radzenie sobie z takimi sytuacjami? –