JSON.Net序列化器忽略JsonProperty?

时间:2011-12-07 23:28:29

标签: 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; }
}

当此对象序列化为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。

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

6 个答案:

答案 0 :(得分:19)

简答:确保所有程序集都引用了 SAME EXACT JSON.NET DLL。可能发生的是你在一个程序集中从一个DLL应用[JsonProperty],并从另一个正在寻找不同[JsonProperty]的程序集中序列化该对象,并且由于CLR对象类型不同,它实际上是有效的忽略。


更长的答案:我刚刚遇到了这个问题,但幸运的是因为我有一个与JsonProperty合作的课程而且我没有能够做一些侦探工作。< / p>

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

当我将课程移到另一个组件时,它完全正常工作。

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

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

答案 1 :(得分:5)

This post helped me.

我使用了serialiser:

new JavaScriptSerializer().Serialize(message)

但是严格地使用它:

JsonConvert.SerializeObject(message);

答案 2 :(得分:3)

在我的情况下,我在属性上应用了JsonProperty属性,但是由于我使用的是asp.net core 3.1,因此使用System.Text.Json中的类型,而不使用JSON.Net中的类型。因此,如果您开始使用asp.core 3.1,则应确定要对json使用哪个库。 HTH。

答案 3 :(得分:2)

我通过使用[System.Runtime.Serialization.DataMember(Name =“_ id”)]而不是JsonProperty标记我的Id属性来修复此问题。至少为什么它最初不起作用仍然不完全清楚......

答案 4 :(得分:0)

我遇到了同样的问题(.Net Core 3.1),原因是我正在使用JsonPropertyName中的System.Text.Json.dll批注,但显然使用了{ {1}}。似乎序列化功能仅尊重其自己的库批注。 将JsonConvert.Serialize(string)注释更改为Newtonsoft.Json.dll可以修复它,因为后者在JsonPropertyName

答案 5 :(得分:0)

我还发现我的 JsonProperty 标签被忽略了。我最终发现加载 Newtonsoft Json 的无声失败是罪魁祸首。 Nancy.Serialization.JsonNet 尝试加载 Newtonsoft Json 9.0.0.0,它比我安装的版本更早。没有出现错误,并且 Nancy.Serialization.JsonNet 提供的序列化程序不可用。将库映射添加到应用程序配置修复了该问题:

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

这是通过尝试在 Main 方法的早期加载 JsonNetSerializer 发现的:

Type t=typeof(JsonNetSerializer);

这触发了加载错误并导致配置解析。