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.

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


较长的回答:我只是有这个问题,但幸运的是,因为我有一个类是与JsonProperty工作,一个不是我能够做一些侦探工作。

我把非工人阶级降到最低限度,并将其与工人阶级进行比较,看不到任何差异——除了非工人阶级在不同的集会中。

当我将类移动到另一个程序集时,它就像它应该的那样完美地工作了。

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

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

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

在我的情况下,我正在应用JsonProperty属性上的属性,但由于我使用asp.net core 3.1,从System.Text.Json类型被使用,而不是从JSON.Net类型。如果你开始使用asp。Core 3.1,你应该决定你想为json使用哪个库。HTH .

这篇文章对我有帮助。

我使用了serialiser:

new JavaScriptSerializer().Serialize(message)

但正确使用:

JsonConvert.SerializeObject(message);

我通过标记我的Id属性[System.Runtime.Serialization.DataMember(Name="_id")]而不是JsonProperty修复了这个问题。仍然不完全清楚为什么它最初没有工作,尽管…

在我的情况下,我使用的是record类型,这意味着您必须使用property:前缀的字段,如在这个问题中提到的:

public record Person
(
  [property:JsonPropertyName("name")]
  string Name,
);

我还发现我的JsonProperty标签被忽略了。我最终发现,加载Newtonsoft Json的无声失败是罪魁祸首。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);

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

相关内容

  • 没有找到相关文章

最新更新