JSON.Net序列化器忽略JsonProperty?

Fra*_*rio 20 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? OriginalId { get; set; }
    public DateTime Date { get; set; }
    public string Message { get; set; }
    public string Sentiment { get; set; }
    public string Author { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当此对象序列化为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"
}
Run Code Online (Sandbox Code Playgroud)

如您所见,Id字段使用错误的字段名称进行渲染.

有任何想法吗?在这个问题上工作了一个小时; 无法弄清楚为什么序列化器似乎忽略了我的JsonProperty.

非常感谢任何建设性的意见.

Sim*_*ver 20

简答题:确保所有的组件都引用完全相同 JSON.NET DLL.可能发生的是你[JsonProperty]在一个程序集中应用一个DLL,并从另一个正在寻找不同的程序集序列化对象[JsonProperty],因为CLR对象类型不同,它实际上被忽略了.


更长的答案:我刚遇到这个问题,但幸运的是因为我有一个正在使用的课程,JsonProperty而且有一个不是我能够做一些侦探工作.

我把非工人阶级剥离到最低限度,并将其与工人阶级进行比较,看不出任何差异 - 除非非工作阶级在不同的集合中.

当我将课程移到另一个组件时,它完美地工作了.

我试图查看名称空间的JSON序列化,但是这似乎并不适用,所以我查看了引用,确定我在我的实体DLL和NUGET 4.5版本中引用了一个旧的JSONNET3.5 DLL在我的主项目文件中.

这给了我两个[JsonProperty]属性实例(它只是一个普通的类),只是因为它们被命名相同并不意味着序列化器甚至会识别属性.

  • 先生就是你这个人。我正在使用新的 JavaScriptSerializer().Deserialize<T>(jsonResponse)。我以为那是 Json.NET。我的错。现在使用您的更改可以完美运行。非常感谢您花时间帮助我找到问题。 (2认同)

ash*_*lon 11

就我而言,我在属性上应用了 JsonProperty 属性,但由于我使用的是 asp.net core 3.1,因此使用了 System.Text.Json 中的类型,而不是 JSON.Net 中的类型。因此,如果您开始使用 asp.core 3.1,您应该决定要使用哪个库来处理 json。HTH。

  • 对此进行扩展:.NET Core 3.1 使用 System.Text.Json.Serialization 中的“JsonPropertyName”属性。如果您只是传递一个字符串,您可以从 `[JsonProperty("name")]` 切换到 `[JsonPropertyName("name")]`,切换您的 Newtonsoft 导入,然后一切就完成了。 (17认同)

Abu*_*ood 9

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


小智 6

这篇文章帮助了我.

我用过serialiser:

new JavaScriptSerializer().Serialize(message)
Run Code Online (Sandbox Code Playgroud)

但是严格地使用这个:

JsonConvert.SerializeObject(message);
Run Code Online (Sandbox Code Playgroud)


Fra*_*rio 5

我通过使用 [System.Runtime.Serialization.DataMember(Name="_id")] 而不是 JsonProperty 标记我的 Id 属性来解决此问题。仍然不完全清楚为什么它最初不起作用......