c# json json.net

c# - JSON.Net serializador ignorando JsonProperty?



(3)

Tengo la siguiente clase de entidad:

public class FacebookComment : BaseEntity { [BsonId(IdGenerator = typeof(ObjectIdGenerator))] [BsonRepresentation(MongoDB.Bson.BsonType.ObjectId)] [JsonProperty("_id")] public ObjectId Id { get; set; } public int? OriginalId { get; set; } public DateTime Date { get; set; } public string Message { get; set; } public string Sentiment { get; set; } public string Author { get; set; } }

Cuando este objeto se serializa a JSON, quiero que el campo Id se escriba como "_id": {...}. AFAIK, debería pasar el nombre de propiedad deseado al atributo JsonProperty; y yo debería ser bueno para ir Sin embargo, cuando llamo a JsonConvert.SerializeObject; parece ignorar mi atributo y muestra esto en su lugar:

{ Author: "Author name", Date: "/Date(1321419600000-0500)/", DateCreated: "/Date(1323294923176-0500)/", Id: { CreationTime: "/Date(0)/", Increment: 0, Machine: 0, Pid: 0, Timestamp: 0 }, Message: "i like stuff", OriginalId: null, Sentiment: "Positive" }

Como puede ver, el campo Id se representa con el nombre de campo incorrecto.

¿Algunas ideas? He estado trabajando en este tema durante una hora; no puedo entender por qué el serializador aparentemente está ignorando mi JsonProperty.

Cualquier entrada constructiva es muy apreciada.


Solucioné este problema marcando mi propiedad de Id con [System.Runtime.Serialization.DataMember (Name = "_ id")] en lugar de JsonProperty. Aún no está del todo claro por qué no funcionó originalmente, aunque ...


Este post me ayudó.

Utilicé serializador

new JavaScriptSerializer().Serialize(message)

Pero usen esto con rigidez

JsonConvert.SerializeObject(message);


Respuesta corta : asegúrese de que todos sus ensamblajes hagan referencia a la MISMA DLL JSON.NET EXACTA . Lo que probablemente está sucediendo es que está aplicando [JsonProperty] de una DLL en un ensamblaje, y está serializando el objeto desde un ensamblaje diferente que está buscando una [JsonProperty] diferente y debido a que los tipos de objetos CLR son diferentes, efectivamente se ignora.

Respuesta más larga : acabo de tener este problema, pero afortunadamente porque tenía una clase que trabajaba con JsonProperty y otra que no era capaz de hacer algún trabajo de detective.

Desplegué la clase no trabajadora al mínimo y lo comparé con la clase trabajadora y no pude ver CUALQUIER diferencia, excepto por el hecho de que la clase no trabajadora estaba en un conjunto diferente.

Cuando moví la clase a la otra asamblea, funcionó perfectamente como debería.

Busqué un poco tratando de ver la serialización JSON de los espacios de nombres, pero eso no parecía aplicarse, así que miré las referencias y, por supuesto, estaba haciendo referencia a una DLL JSONNET3.5 antigua en mi DLL de entidades y la versión NUGET 4.5 en mi archivo de proyecto principal.

Esto me da dos instancias del atributo [JsonProperty] (que es solo una clase regular) y el hecho de que tengan el mismo nombre no significa que el serializador vaya a reconocer el atributo.