通过选项自定义 JsonConverter 的不同输出?

Posted

技术标签:

【中文标题】通过选项自定义 JsonConverter 的不同输出?【英文标题】:Different outputs from custom JsonConverter via options? 【发布时间】:2021-10-28 01:32:25 【问题描述】:

问题尽可能简短: 我编写了一个自定义 JsonConverter 来来回序列化/反序列化数据,并希望能够通过我传递给转换器的标志/选项来控制输出。

全文 与 vue-frontend 一起运行的 asp.net Core 5 后端。通过 SignalR 连接。系统控制设备(前端的状态,后端的命令/设置)。后端包含一个设备列表,每当发生更改时,它都会序列化该设备(通过我的转换器)并将数据发送到前端。 有时我想将设置存储在磁盘上的 JsonFile 中,以保留在前端进行的设置。通过序列化我的设备列表可以毫无问题地工作。

现在,有些设备具有易失性数据,我确实希望将其显示在前端,但是当将此设备转储到磁盘时,我不希望它们永久存储,因为它们在下次使用时没有任何意义设置被读回。

我试过了...[JsonIgnore]当然是不行的,因为这在前端序列化时也会忽略参数。

我认为[CustomAttribute] 可以帮助我,但是在序列化时我当然可以检查该属性是否具有我的自定义属性,但那时我不知道我是为前端还是设置文件序列化。

我还尝试扩展 JsonSerializerOptions 以附加我自己的参数,但该类是密封的 - 所以现在就可以了。

是的,我可以复制我的整个 JsonConverter,给它另一个名称,并且在为前端进行序列化时使用 Converter-A,在将设置写入磁盘时使用 Converter-B,但是来吧……这不可能!

感觉我的整个方法都错了?

【问题讨论】:

嗨@sutt,您似乎想要可选地序列化模型数据。你的场景是什么?我的意思是你什么时候想序列化? @Rena,感谢您抽出宝贵时间回答。如原始帖子中所述,我有时想在序列化时删除某些属性。一般来说,序列化总是会发生,但我序列化的“目标”不同。 【参考方案1】:

嗯,有点尴尬,但我想我有一个解决办法。

我只是向 JsonConverter 添加一个属性,我将在为 settings-file-conversion 创建转换器时设置该属性。 在实例化 InnerConverter 时,我将该参数传递给构造函数并将其存储在私有变量中。

结合自定义属性,我几乎可以达到我想要的位置,而无需复制我的转换器。

【讨论】:

以上是关于通过选项自定义 JsonConverter 的不同输出?的主要内容,如果未能解决你的问题,请参考以下文章

c# 通过json.net中的JsonConverter进行自定义序列化与反序列化

.net HttpClient 与自定义 JsonConverter

NewtonsoftJson 中的自定义 JSONConverter 用于序列化

自定义 JsonConverter WriteJson 不会改变子属性的序列化

具有数据类型的 Json.NET 自定义 JsonConverter

如何在 JSON.NET 中实现自定义 JsonConverter?