【问题标题】:Issue returning a JSON associative array from an ASP.NET Core Web API从 ASP.NET Core Web API 返回 JSON 关联数组的问题
【发布时间】:2021-01-04 08:49:36
【问题描述】:

我在 ASP.NET Core 3.1 中有一个 Web API 方法,它返回一个可枚举的对象列表:

public async Task<IEnumerable<MyObject>> Get()

Web API 默认返回 JSON。这一直很好,直到我向 MyObject 添加了 Dictionary 类型的属性,没有意识到 ASP.NET Core 3.1 用于构建响应的任何序列化程序都无法序列化 Dictionary(错误是“type Dictionary”)。我可以通过尝试使用新的 System.Text.Json 库对 Dictionary 进行序列化来重现相同的错误,我猜测 Web API 正在使用它来构建 JSON 响应。

由于 JsonConvert 仍然可以很好地序列化 Dictionary,因此在方法中手动进行序列化并不难。但这意味着制作我自己的 JSON 响应并将其作为内容字符串返回,这看起来……不太好。

我是否可以使用另一种关联数组类型,以便 Web API 可以正确序列化为 JSON?或者有没有办法将 Web API 配置为使用可以处理 Dictionary 的 JSON 序列化库?还是我只是坚持为此方法制作自己的 JSON 响应?

编辑:需要明确的是,我很好奇其中哪些是可能的,每种方法的优点或缺点是什么,以便我可以根据我的情况选择一个好的解决方案。

【问题讨论】:

  • 在微软的文档中有一个如何为Dictionary<Enum,TValue> 编写自定义JsonConverter 的示例:Support Dictionary with non-string key。你可以遵循这种模式。或者,只需将您的数据模型从 Dictionary<int, T> 转换为 Dictionary<string, T> 即可。
  • @IanKemp 对不起,但我在这里不仅要问每种方法是否可行,还要问它是否比其他方法更好或更差。至少在我的经验中,这正是 StackOverflow 比 Google 更擅长的地方。
  • @dbc 谢谢,我什至没有想过转换字典的底层类型,因为我没有意识到这是一个特别有问题的非字符串键。这应该对我们有用,而无需更改 API 使用的 Json 序列化。
  • @Jason 对不起,如果我遇到了生硬的问题 - Stack Overflow 上提出了 很多 问题,其中大部分不值得任何人花时间,而且令人沮丧与他们打交道。你似乎真的是来这里学习的,这正是这个网站的目的,我不想阻止这一点。请确保您的问题尽可能具体——这有助于我们为您提供帮助。

标签: json.net asp.net-core-webapi system.text.json


【解决方案1】:

这个答案来自 cmets 中的@dbc。我没有意识到 System.Text.Json 序列化 Dictionary 的困难通常不是 Dictionary ,而是特别是 Dicitonary 使用非字符串键。对我们来说,编写一个转换器将必要的 Dictionary 转换为字符串键类型是微不足道的,然后内置的 JSON 序列化处理它就很好了。

谢谢,@dbc!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    相关资源
    最近更新 更多