Soy un poco nuevo en WCF e intentaré describir claramente lo que intento hacer.Deserialización WCF JSON genérica
Tengo un servicio web WCF que utiliza solicitudes JSON. Me está yendo bien enviando/recibiendo JSON en su mayor parte. Por ejemplo, el siguiente código funciona bien y como se esperaba.
JSON envió:
{ "guy": {"FirstName":"Dave"} }
WCF:
[DataContract]
public class SomeGuy
{
[DataMember]
public string FirstName { get; set; }
}
[OperationContract]
[WebInvoke(Method = "POST",
BodyStyle = WebMessageBodyStyle.WrappedRequest,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json)]
public string Register(SomeGuy guy)
{
return guy.FirstName;
}
Esto devuelve un objeto JSON con "Dave" como se esperaba. El problema es que no siempre puedo garantizar que el JSON que recibo coincidirá exactamente con los miembros de mi DataContract. Por ejemplo, el JSON:
{ "guy": {"firstname":"Dave"} }
no se serializarán correctamente porque la carcasa no coincide. guy.FirstName será nulo. Este comportamiento tiene sentido, pero realmente no sé cómo evitarlo. ¿Tengo que forzar los nombres de los campos en el cliente o hay alguna manera de reconciliarme en el lado del servidor?
Una pregunta posiblemente relacionada: ¿puedo aceptar y serializar un objeto JSON genérico en un StringDictionary o algún tipo de estructura de valor de clave simple? Entonces, no importa qué nombres de campo se envíen en el JSON, ¿puedo acceder a los nombres y valores que me han enviado? En este momento, la única forma en que puedo leer los datos que recibo es si coincide exactamente con un DataContract predefinido.
* * Por supuesto que se puede garantizar que el JSON es conforme al contrato.Solo si no tiene el control del cliente, no podría controlarlo. Si no tiene el control del cliente, probablemente esté fuera del dominio de su servicio y el punto es discutible. No veo el problema. Todas las soluciones que veo son inútiles y solo agregarán dolor. Lea las especificaciones en DataContract/DataMember y sígalas. 2 pesos –
Tienes razón. Técnicamente, podría escribirlo en el JS antes de que se envíe la información. Y, insinué en un comentario diferente que esto es probablemente lo que haré al final. Sin embargo, me gustaría que un servicio pueda manejar un número arbitrario de campos que no son necesariamente conocidos de antemano. ¿Tiene sentido? Solo quiero un servicio que pueda aceptar una lista completamente arbitraria de pares de "clave": "valor" y luego decidir qué hacer con ellos sin tener que conocer los nombres de "clave" de antemano. – davidmdem