wcf - online - cómo no devolver un valor nulo cuando un campo de miembro de datos no se establece en el contrato de datos
serialize json javascript (1)
Puede marcar cada miembro de datos para que no se serialice si es nulo. La parte esencial es: EmitDefaultValue = false
[DataContract]
public class Person
{
[DataMember(EmitDefaultValue = false)]
public string id { get; set; }
[DataMember(EmitDefaultValue = false)]
public string firstname { get; set; }
[DataMember(EmitDefaultValue = false)]
public string lastname { get; set; }
[DataMember(EmitDefaultValue = false)]
public string city { get; set; }
}
Tengo un problema extraño con mi servicio WCF
que devuelve datos en formato JSON
. Quiero devolver información sobre un "Cliente" en función de la solicitud enviada por el cliente.
El cliente puede solicitar qué campos de información sobre un cliente que necesitan y el servicio necesita para enviar solo esa información sobre el cliente.
Por ejemplo: si el cliente solicita una lista de clientes y dice que quiere el primer nombre, el apellido, la ciudad de cada cliente, entonces el servidor debe enviar una respuesta json con cada nombre de campo y el valor correspondiente
Algo como...
[
{"firstname":"john","lastname":"Goodman","city" :"NY"},
{"firstname":"brad","lastname":"newman","city" :"LA"}
]
Si el cliente solicita solo una lista de clientes con campos de ID y ciudad, la respuesta debería tener este aspecto
[
{"id" :"1234","city" :"NY"},
{"id":"1235","city" :"LA"}
]
Mi diseño inicial fue implementar una clase de "Cliente" y luego tener cada "campo" posible como un campo de esta clase. Luego, dentro de mi método de servicio, estaba obteniendo la lista de campos especificados por el cliente y creando una instancia de los objetos del cliente con solo esas propiedades establecidas.
Mi contrato de operación se ve así
[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, UriTemplate = "Customers?fields={value}")]
List<Customer> GetCustomers(string value);
Pero el problema es cuando decoro la clase con "DataContract" y cada Campo como "DataMember" ... si algunas propiedades no están establecidas, aún se deserializan como NULL cuando se envían al cliente. No quiero que esto suceda.
Además, la lista de campos posibles para un cliente es muy larga y la clase se hizo muy grande. Preferiría almacenar estos campos como una colección de enumeración en mi servicio en lugar de los campos de una clase.
Luego pensé que mi Operación devolviera un IDictionary<string,object>
y luego agregaría cada campo y valor iterativamente a esta colección. Eso no funcionó porque, cuando un diccionario se serializa, muestra {"Key:dfas", "Value:34"
} etc. etc., no lo que quiero
Así que estoy un poco atascado. ¿Cuál es la mejor manera de resolver este problema?
¿Puedo marcar mi [DataContract]
tal manera que si las propiedades de [DataMember]
no están establecidas, es decir, nulas, no deberían serializarse y enviarse al cliente?