首页 > 解决方案 > 为什么 JsonConvert.DeserializeObject 忽略 JsonPropertyName 属性?

问题描述

我对 JsonConvert 反序列化器有疑问。我有课

[BsonCollection("matches")]
public class MatchData : Document
{
    [JsonPropertyName("id")]
    public string ExternalMatchId { get; set; }

    ...
}    

在我的控制器中,我试图以这种方式反序列化:

[HttpPost("end")]
public ActionResult RoundEnd([FromBody] dynamic data)
{
    var saveData = JsonConvert.DeserializeObject<MatchData>(data.ToString());

    ...
}

输入 JSON 看起来像

 "{"id": "61696f268c7b70b5f3e85803",
 "game_server_id": "615ed4a1cd95e8209a4ab67d",
...

但是在我的输出MatchData对象ExternalMatchId中是空的。如何解决?

标签: c#jsonjson.netdeserializationjson-deserialization

解决方案


你在这里混合框架。该JsonPropertyName属性用于System.Text.Json命名空间,而您使用 JSON.Net 进行反序列化。所以解决方案是坚持其中之一。使用内置框架反序列化:

System.Text.Json.JsonSerializer.Deserialize<MatchData>(data.ToString());

或者切换属性以使用 JSON.Net 版本:

[JsonProperty("Foo")]

说了这么多,看起来您可以通过让 MVC 为您完成工作来简化整个事情。而不是dynamic用作模型(不要这样做 - 动态是有问题的,每次使用它时都会有一只小猫死掉),直接将模型放在这里:

public ActionResult RoundEnd([FromBody] MatchData data)

推荐阅读