在序列化期间有条件地更改属性名称

问题描述 投票:0回答:1

我有模型课程

ClassA
ClassB

这些类作为两个控制器的结果返回:

XController
YController

当从

YController
返回这些类的结果时,将使用默认序列化。

当从

XController
返回这些类时,应重命名
ClassA
的两个属性(类型或值的输出方式不变),并且需要重命名
ClassB
的一个属性(与之前相同) 。
XController
只有
GET
调用,因此不需要处理自定义反序列化。使用
JsonPropertyName
不满足此要求。

我该怎么做?

我按照 在 ASP.NET Core 中使用多个 JSON 序列化设置添加了自定义

SystemTextJsonOutputFormatter
(称为
ExternalJsonOutputFormatter
(用于输出 JSON 以供“外部”客户端使用))。但是,我看不到在哪里以及如何自定义特定属性的名称。我的猜测是我必须覆盖
WriteAsync(...)
方法,但不知道在那里做什么(例如,我必须达到多低级别才能实现我想要的?)。

甚至在线示例的链接也很方便(我找不到任何可以显示我需要的内容)。

我非常愿意坚持

System.Text.Json

c# asp.net-core asp.net-core-6.0 jsonserializer json-serialization
1个回答
0
投票

作为占位符,我已经实现了以下解决方案(因为我需要快速解决方案),尽管我更喜欢更好、更标准化的方法,所以期待答案。

我已经有了一个实用方法,它接受

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

不过,正如前面提到的,这个解决方案是有效的,我愿意接受其他更好的想法。

© www.soinside.com 2019 - 2024. All rights reserved.