我有模型课程
ClassA
和ClassB
。
这些类作为两个控制器的结果返回:
XController
和YController
。
当从
YController
返回这些类的结果时,将使用默认序列化。
当从
XController
返回这些类时,应重命名 ClassA
的两个属性(类型或值的输出方式不变),并且需要重命名 ClassB
的一个属性(与之前相同) 。 XController
只有 GET
调用,因此不需要处理自定义反序列化。使用 JsonPropertyName
不满足此要求。
我该怎么做?
我按照 在 ASP.NET Core 中使用多个 JSON 序列化设置添加了自定义
SystemTextJsonOutputFormatter
(称为 ExternalJsonOutputFormatter
(用于输出 JSON 以供“外部”客户端使用))。但是,我看不到在哪里以及如何自定义特定属性的名称。我的猜测是我必须覆盖 WriteAsync(...)
方法,但不知道在那里做什么(例如,我必须达到多低级别才能实现我想要的?)。
甚至在线示例的链接也很方便(我找不到任何可以显示我需要的内容)。
我非常愿意坚持
System.Text.Json
。
作为占位符,我已经实现了以下解决方案(因为我需要快速解决方案),尽管我更喜欢更好、更标准化的方法,所以期待答案。
我已经有了一个实用方法,它接受
object
并将其转换为等效的 IDictionary<string, object?>
:
public static IDictionary<string, object?> ToDictionary(object obj,
ISet<string>? propertiesToIgnore = null)
当作为端点调用的结果返回时,序列化与预期完全一致(想一想:C# 中 JSON 最简单、最直接的表示形式是
IDictionary<string, object?>
,可能包含在 IList
中)。
我创建了一个属性
DictionaryPropertyNameAttribute
(类似于 JsonPropertyNameAttribute
),可用于提供自定义名称。不同之处在于,虽然 JsonPropertyNameAttribute
一旦设置,将始终应用,但我在 bool
调用中添加了 ToDictionary
,以允许方法调用者打开/关闭重命名:
public static IDictionary<string, object?> ToDictionary(object obj,
ISet<string>? propertiesToIgnore = null, bool useCustomNames = false)
为了向后兼容,默认情况下
useCustomNames
是 false
。
不过,正如前面提到的,这个解决方案是有效的,我愿意接受其他更好的想法。