C# JSON.Net序列化程序是否忽略JsonProperty?

C# JSON.Net序列化程序是否忽略JsonProperty?,c#,json,json.net,C#,Json,Json.net,我有以下实体类: public class FacebookComment : BaseEntity { [BsonId(IdGenerator = typeof(ObjectIdGenerator))] [BsonRepresentation(MongoDB.Bson.BsonType.ObjectId)] [JsonProperty("_id")] public ObjectId Id { get; set; } public int? Origin

我有以下实体类:

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”:{…}。好了,我只需要将所需的propertyname传递给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


非常感谢任何建设性的输入。

我用[System.Runtime.Serialization.DataMember(Name=“\u Id”)]而不是JsonProperty标记了我的Id属性,从而解决了这个问题。仍然不完全清楚它最初为什么不工作…

简短回答:确保所有程序集都引用了相同的JSON.NET DLL。可能发生的情况是,您正在从一个程序集中的一个DLL应用
[JsonProperty]
,并从另一个程序集中序列化对象,该程序集正在查找不同的
[JsonProperty]
,并且由于CLR对象类型不同,因此实际上会忽略该对象


更详细的回答:我刚刚遇到了这个问题,但幸运的是,因为我有一个类正在使用
JsonProperty
,而另一个类不是,所以我能够做一些检测工作

我把非工人阶级精简到最低限度,并将其与工人阶级进行比较,除了非工人阶级在不同的议会中这一事实之外,我看不出任何差异

当我将类移动到另一个程序集时,它工作得很好

我花了一点时间试图研究名称空间的JSON序列化,但这似乎不适用,所以我查看了引用,果然在我的entities DLL中引用了一个旧的JSONET3.5 DLL,在我的主项目文件中引用了NUGET 4.5版本

这给了我两个
[JsonProperty]
属性的实例(这只是一个常规类),并且仅仅因为它们的名称相同,并不意味着序列化程序甚至可以识别该属性。

我使用了serialiser:

new JavaScriptSerializer().Serialize(message)
但要严格使用:

JsonConvert.SerializeObject(message);

在我的例子中,我在属性上应用了JsonProperty atrtibute,但由于我使用的是asp.net core 3.1,所以使用的是System.Text.Json中的类型,而不是Json.net中的类型。因此,如果您开始使用asp.core 3.1,您应该决定将哪个库用于json。HTH.

我也遇到了同样的问题(.Net Core 3.1),原因是我使用的是
JsonPropertyName
注释,它位于
System.Text.Json.dll
中,但使用的是
JsonConvert.Serialize(string)
,这显然在
Newtonsoft.Json.dll
中。序列化函数似乎只考虑它们自己的库注释。
JsonPropertyName
注释更改为
JsonProperty
修复了它,因为后者位于
Newtonsoft.Json.dll

中,所以BaseEntity也有和Id属性?不,BaseEntity只有一个DateCreated字段。你有没有发现这一点?我很确定我的答案(花了我两个小时!)可能就是我使用1个程序集引用Newtonsoft.Json,我仍然遇到这个问题,甚至DataMember属性对我都不起作用。非常奇怪的东西。你确定你做了一个干净的构建并且你的容器中没有额外的dll吗?如果有多个项目,是否为每个项目定义了相同的JSON.NET DLL?尝试在运行时评估
typeof(JsonProperty).Assembly.CodeBase
,以确保DLL已加载,并且不是来自意外的地方。我将其拆分为一个项目,并进行了清理,以确保同样的情况。也许是这个版本的错误?先生,你就是那个人。我正在使用新的JavaScriptSerializer().Deserialize(jsonResponse)。我以为那是Json.NET。我的错误。使用您的零钱,它现在工作得非常完美。非常感谢您花时间帮助我找到问题。太好了:)我想每个人都会犯这样的错误:)为了扩展这个:.NET Core 3.1使用System.Text.Json.Serialization中的“JsonPropertyName”属性。如果您只是传入一个字符串,您可以从
[JsonProperty(“name”)]
切换到
[JsonPropertyName(“name”)]
,切换出Newtonsoft导入,就可以完成所有设置。