Ich habe das Internet nach Informationen darüber durchforstet, aber die meisten Ergebnisse beziehen sich auf das Erstellen von WCF-Diensten oder Situationen, in denen der Dienst unter Ihrer Kontrolle steht.WCF-Client Wie kann ich ein inkompatibles Datumsformat aus der JSON-Antwort deserialisieren?
Ich erstelle einen WCF-Client-Proxy für einen RESTful JSON-Dienst, den ich nicht kontrollieren kann. Ich verwende das grundlegende ServiceContract/DataContract-Muster und versuche, das Framework so viel wie möglich von der Arbeit ausführen zu lassen.
Meistens funktioniert das gut, aber alle von diesem externen Dienst kommenden Datetime-Felder haben ein bestimmtes Format, z.
{"SomeObject":
{"details":"blue and round", "lastmodified":"2013/01/02 23:14:55 +0000"}
}
So bekomme ich einen Fehler:
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.'.
My Datacontract ist:
namespace Marshmallow.WebServices.ServiceModels
{
[DataContract]
public class SomeObject
{
[DataMember(Name = "details")]
public string Details { get; set; }
[DataMember(Name = "lastmodified")]
public DateTime LastModified { get; set; }
}
}
Mein Servicekontrakt ist:
[ServiceContract]
public interface ICoolExternalApi
{
[OperationContract]
[WebGet(UriTemplate = "/something.json",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped)]
[return: MessageParameter(Name = "SomeObject")]
SomeObject GetAccount();
}
Was ich wissen will, ist, Wo kann ich etwas Kabeljau stecken? e, um zu definieren, wie WCF das lastmodified-Feld deserialisieren soll (ein DateTime-Objekt aus der Zeichenfolge erstellen)?
Oder noch besser, definieren Sie, wie alle DateTime DataMembers für alle meine DataContracts deserialisiert werden. Ich möchte nicht viel Code wiederholen.
Ich möchte auch nicht auf einige Deserializer von Drittanbietern zurückgreifen, noch möchte ich anfangen, alles andere durch eine benutzerdefinierte Deserialisierungsmethode zu setzen, wenn es vermeidbar ist.
Die Deserialisierung zu einer Zeichenfolge weist die von Ihnen notierten Einschränkungen auf. Es wird funktionieren, ist aber alles andere als elegant. Das Einrichten eines IDispatchMessageInspectors ist ein wenig aufwendiger, sollte aber sauberer sein. –
ich wie mit einem IDispatchMessageInspector fühlen, ist nicht wirklich elegant. A) Regex ist langsam und nicht sehr skalierbar. B) Es ist eine zusätzliche Analyse des gesamten JSON-Körpers. C) Ich würde die Datetime Strings in ‚das‘ Format „\/Date (1297293089984-0800) \ /“, die dann wieder die Datamember (Doppelverarbeitung) popluate analysiert werden würden konvertieren. D) Es ist ein Hack. Sicherlich muss es eine andere WCF-Funktion sein, die ich nicht verstehe (OnDeserializing oder so etwas?), Die mit diesen Situationen umgehen ausgelegt ist? –