Серийный анализатор JSON.Net игнорирует JsonProperty?

У меня есть следующий класс сущностей:

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; }
}

Когда этот объект сериализуется в JSON, я хочу, чтобы поле Id было написано как "_id": {...}. AFAIK, мне нужно просто передать искомое имя свойства в атрибут JsonProperty; и мне должно быть хорошо идти. Однако, когда я вызываю JsonConvert.SerializeObject; он, кажется, игнорирует мой атрибут и делает это вместо этого:

{
    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"
}

Как вы можете видеть, поле Id отображается с неправильным именем поля.

Есть идеи? Работал над этим вопросом в течение часа; не может понять, почему сериализатор, по-видимому, игнорирует мой JsonProperty.

Приветствуется любой конструктивный вклад.

Ответ 1

Я исправил эту проблему, отметив мое свойство Id с помощью [System.Runtime.Serialization.DataMember(Name = "_ id")] вместо JsonProperty. Все еще не совсем понятно, почему он не работал изначально, хотя...

Ответ 2

Короткий ответ: Убедитесь, что все узлы ссылки на EXACT SAME Json.NET DLL. Вероятно, вы применяете [JsonProperty] из одной библиотеки DLL в одной сборке и сериализуете объект из другой сборки, которая ищет другую [JsonProperty] и поскольку типы объектов CLR различны, ее фактически игнорируют.


Более длинный ответ: у меня была эта проблема, но, к счастью, потому что у меня был один класс, который работал с JsonProperty и тот, который был не в состоянии выполнить какую-то детективную работу.

Я убрал нерабочий класс до минимума и сравнил его с рабочим классом и не видел никаких различий - кроме того, что нерабочий класс находился в другой сборке.

Когда я переместил класс на другую сборку, он работал отлично, как должен.

Я немного задумался, пытаясь заглянуть в сериализацию пространств имен JSON, но это, похоже, не применялось, поэтому я просмотрел ссылки и, конечно же, я ссылался на старую JSONNET3.5 DLL в своих объектах DLL и NUGET 4.5 версии в моем основном файле проекта.

Это дает мне два экземпляра [JsonProperty] (который является просто обычным классом), и только потому, что они называются одинаковыми, это не значит, что сериализатор будет даже распознавать атрибут.

Ответ 3

Этот пост помог мне.

Я использовал сериализатор:

new JavaScriptSerializer().Serialize(message)

Но строго используйте это:

JsonConvert.SerializeObject(message);