【问题标题】:JSON.Net serializer ignoring JsonProperty?JSON.Net 序列化程序忽略 JsonProperty?
【发布时间】:2021-08-11 03:24:22
【问题描述】:

我有以下实体类:

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。

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

【问题讨论】:

  • 那么 BaseEntity 也有 and Id 属性?
  • 不,BaseEntity 只有一个 DateCreated 字段
  • 你有想过这个吗?我很确定我的答案(我花了两个小时!)可能是发生了什么

标签: c# json json.net


【解决方案1】:

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


更长的答案:我刚刚遇到了这个问题,但幸运的是,因为我有一堂正在使用 JsonProperty 的班级,而另一堂不是我能够做一些侦探工作。

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

当我将课程移到另一个程序集时,它可以正常工作。

我试图研究命名空间的 JSON 序列化,但似乎并不适用,所以我查看了引用,果然我在我的实体 DLL 和我的主项目文件中的 NUGET 4.5 版本。

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

【讨论】:

  • 我只使用了 1 个引用 Newtonsoft.Json 的程序集,但我仍然遇到这个问题,甚至 DataMember 属性都不适合我。很奇怪的东西。
  • 你确定你做了一个干净的构建并且你的 bin 中没有额外的 dll 吗?如果您有多个项目,是否为每个项目定义了相同的 JSON.NET DLL?尝试在运行时评估 typeof(JsonProperty).Assembly.CodeBase 以确保 DLL 已加载并且不会来自意外的地方
  • 你先生是人。我正在使用新的 JavaScriptSerializer().Deserialize(jsonResponse)。我以为那是 Json.NET。我的错。现在使用您的更改可以完美运行。非常感谢您花时间帮助我找到问题。
  • 太棒了 :) 我想每个人都会在某个时候犯这个错误 :)
  • 这为我解决了。我有两个不同的“用途”感谢发帖!!!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    就我而言,我在属性上应用了 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 导入,然后一切就绪。
    【解决方案4】:

    This post helped me.

    我使用了序列化器:

    new JavaScriptSerializer().Serialize(message)
    

    但是正确使用这个:

    JsonConvert.SerializeObject(message);
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        我还发现我的 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);
        

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

        【讨论】:

          猜你喜欢
          • 2012-12-18
          • 2014-01-08
          • 2016-08-27
          • 1970-01-01
          • 2014-01-04
          • 1970-01-01
          相关资源
          最近更新 更多