2011-06-10 15 views
36

Actualmente estoy usando los mismos DTO C# para extraer datos de CouchDB, a través de LoveSeat que debo devolver JSON a través de un controlador ASP MVC.Newtonsoft ignorar los atributos?

Estoy utilizando la biblioteca NewtonSoft para seralizar mis DTO antes de enviarlos a través del controlador.

Sin embargo, como CouchDB también utiliza NewtonSoft también está respetando el nivel de propiedad atribuye NewtonSoft como

[JsonIgnore] 
[JsonProperty("foo")] 

hay alguna forma de decirle a la biblioteca newtonsoft hacer caso omiso de estos atributos de forma explícita? LoveSeat me permite proporcionar mi propia impl de IObjectSerializer, que me da un control total sobre netwonsofts JsonSerializerSettings. Entonces, a través de estas configuraciones, ¿puedo ignorar los atributos?

Pregunto porque la única alternativa que puedo ver en este punto es engañar a mis DTO. Si bien no es terrible, no es genial.

La única otra forma que puedo ver es incorporar mi propia versión de la fuente Newtonsoft.Json a mi proyecto, con un nombre de ensamblaje diferente, etc. Pero de esta manera la locura definitivamente miente y voy a engañar a los DTO antes Voy por este camino.

Respuesta

4

Terminé haciendo todas las propiedades que necesitaba para agregar atributos a virtuales, y anularlos solo en otra clase, con los atributos newtonsoft relevantes.

Esto me permite tener un comportamiento de serialización diferente al quitar la serialización de CouchDB y la serialización para un GET, sin demasiados engaños. Está bien, y una ventaja, que los dos están acoplados; cualquier cambio en la base que quisiera de todos modos.

¿Sería bueno saber si mi pregunta original es posible?

6

Una sugerencia que quizás no te agrade. Para las mejores prácticas, recomiendo tener dos objetos casi idénticos. Uno específicamente para su capa de acceso a datos (objeto de dominio) que se asigna a su base de datos. Y un DTO separado que sus aplicaciones se preocupan. De esta forma, el objeto de dominio contendrá en su mayoría más propiedades que el DTO y podrá separar las preocupaciones.

+0

Gracias por la respuesta! El origen de datos en este caso es CouchDB, no una base de datos SQL no ramificada. Por lo tanto, ya está almacenado en formato JSON, y se puede deserializar directamente desde el sofá. Entonces, las únicas diferencias serían literalmente los atributos de Newtonsoft. Como dije en mi publicación original, estoy preparado para ir por la ruta DTO si no hay otro camino. – Jammin

2

This newtonking.com link ayudado en una situación similar. Extiende la clase DefaultContractResolver. Para que funcione tuviera que sustituir

protected override IList<JsonProperty> CreateProperties(JsonObjectContract contract) 

con

protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) 
38

No estoy seguro de si esto es lo que está buscando, pero por lo que entiendo que está buscando el atributo [JsonIgnore] . Impide que las propiedades se serialicen con el resto del objeto en JSON.

[JsonIgnore] 
public string Whatever{ get; set; } 
+2

¿Alguna solución para ignorar deserializar pero todavía serializar? Gracias. –

Cuestiones relacionadas