为什么JsonConvert.DeserializeObject忽略了JsonPropertyName属性?

4

我在使用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为null。如何解决这个问题?


你确定 BsonCollectionAttribute 是正确的吗? - Peter Csala
我已经尝试过没有它,输出结果相同。 - hoozr
你的 Document 类有一个名为 id 的属性吗? - Jonas Weinhardt
data.ToString()会返回什么?我有一种感觉,它可能不是你所期望的。 - fredrik
我认为您混淆了System.Text.Json和Newtonsoft。请尝试在ExternalMatchId上使用JsonProperty属性,或在控制器操作中使用JsonSerializer.Deserialize<MatchData>方法。 - Peter Csala
1个回答

9
您在这里混淆了框架。 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)

You don't need to add it. - DavidG
我需要了解更多关于这个错误的信息,才能理解为什么会发生这种情况。 - DavidG
我无法提供更多信息,因为我正在通过POST webhook获取数据。在500内部服务器错误发生之前是否有可能确定一些内容?也许使用一些断点。 - hoozr
然后在本地调试它,并使用类似Postman的工具将其发布到您的Webhook中。很抱歉,我不能提供更多帮助。 - DavidG
我已经在Startup中使用AddNewtonsoftJson()和[JsonProperty("id")]属性使其正常工作。我认为我应该尝试弄清楚如何在不添加Mvc.NewtonSoft依赖项的情况下使用System.Text.Json。 - hoozr
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接