.NET Core 中带参数的自定义 JsonConverter

2024-02-11

我编写了自己的 JsonConverter(使用 ASP.Net Core 3.1),打算在我的 DTO 上使用它。

在以前的版本中(Newtonsoft.Json),您可以在自定义 JsonConverter 类上添加构造函数,并使用 JsonConverterAttribute 指定参数:

[JsonConverter(typeof(MyDecimalConverter), 3)]
public decimal MyProp { get; set; }

然而,迁移到之后System.Text.Json.Serialization,这个选项已经没有了。新的 JsonConverterAttribute 根本没有构造函数。

实现这一目标的新方法是什么?


我也错过了 System.Text.Json.Serialization 中的这个功能,并且曾经对每个格式化情况使用自定义 JsonConverter,但我真的不喜欢。我最好的解决方法是用更干净的方式解决这个问题 - 至少对我来说 - 使用自定义 JsonConverterAttribute。 我在 .NET6 应用程序中使用它,但根据,它也适用于 Core 3.1。

所以这个例子: 创建一个需要构造函数参数的转换器(基于已经完成的问题)。就我而言,它是格式字符串。

public class DoubleConverter : JsonConverter<double>
{
    private readonly string _format;

    public DoubleConverter(string format) => _format = format;


    public override double Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // Not needed for the example.
        throw new NotImplementedException();
    }

    public override void Write(Utf8JsonWriter writer, double value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString(_format));
    }
}

然后创建一个自定义 JsonAttribute。这部分使使用变得简单,因为它接受所需的构造函数参数,并使用该参数创建自定义 JsonConverter。

[AttributeUsage(AttributeTargets.Property)]
public class DoubleSerializationStringFormatAttribute : JsonConverterAttribute
{
    private readonly string _format;

    public DoubleSerializationStringFormatAttribute(string format) => _format = format;

    public override JsonConverter CreateConverter(Type typeToConvert)
    {
        if (typeToConvert != typeof(double))
        {
            throw new ArgumentException(
                $"This converter only works with double, and it was provided {typeToConvert.Name}.");
        }

        return new DoubleConverter(_format);
    }
}

现在该属性可以用于任何属性:

public class DataClass
{
    [DoubleSerializationStringFormat("N2")]
    public double Prop1 { get; set; }

    [DoubleSerializationStringFormat("N5")]
    public double Prop2 { get; set; }
}

最后我可以序列化 DataClass 实例:

var data = new DataClass() {Prop1 = 10.5678, Prop2 = 3.14159267};
var serialized = JsonSerializer.Serialize(data);
Console.Write(serialized);

我得到了根据指定格式序列化的数字:

{
    "Prop1":"10.57",
    "Prop2":"3.14159"
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET Core 中带参数的自定义 JsonConverter 的相关文章

  • LINQ to Entities 区分大小写的比较

    这不是 LINQ to Entities 中区分大小写的比较 Thingies First t gt t Name ThingamaBob 如何使用 LINQ to Entities 实现区分大小写的比较 那是因为你正在使用LINQ 实体最
  • 从类型获取 DbSet

    我正在尝试为 MVC 6 应用程序制作通用表查看器 编辑器 我目前使用 Context GetEntityTypes 返回给我一份表格列表 现在我需要获取特定类型的数据 我当前的实现是 On my context public IQuery
  • 如何为 Gson 编写自定义 JSON 反序列化器?

    我有一个 Java 类 用户 public class User int id String name Timestamp updateDate 我收到一个包含来自 Web 服务的用户对象的 JSON 列表 id 1 name Jonas
  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • Blazor:单击按钮时调用服务器方法?

    我创建了一个示例 Blazor 项目 该脚手架有两个示例 1 调用网页中存在的 C 方法 计数器 2 在网页初始化开始时调用服务器方法 天气表 但没有任何调用服务器方法并在单击按钮时获取结果的示例 那可能吗 例如 我可以将这样的方法添加到
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 发送 POST 请求时 JSON 原语无效

    我有以下 ajax 请求 其中我尝试将 JSON 对象发送到服务器 function sendData subscriptionJson ajax type POST url Url Action SubscribeSecurities S
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • SQL查询json字典数据

    我的表中的 CLOB 字段包含 JSON 如下所示 a value1 b value2 c value3 我正在尝试编写一个 SQL 查询来返回一个包含键和值字段的表 如下所示 key value a value1 b value2 c v
  • JSON 解析错误:需要“STRING”

    我在用JSONLint http jsonlint com 解析一些 JSON 我不断收到错误 错误 第 1 行解析错误 产品 需要 STRING 却得到 未定义 这是代码 product code Abc123 description S
  • 访问 XAML 中的静态字段

    如何在 xaml 中引用类的静态属性 换句话说 我想做这样的事情 Class BaseThingy public static readonly Style BaseStyle
  • ASP.NET MVC:如何可靠地获取当前请求的真实URL?

    现在我有一个 MVC 应用程序运行在http 127 0 0 1 8081 http 127 0 0 1 8081 它实际上在 Azure 计算模拟器中运行 浏览器位置栏清楚地显示端口号为 8081 然而 Request Url and R
  • 通过标识引用对象的标准方法(例如循环引用)?

    JSON 中是否有通过身份引用对象的标准方法 例如 具有大量 可能是循环 引用的图形和其他数据结构可以被合理地序列化 加载吗 Edit 我知道做一次性解决方案很容易 列出图中所有节点的列表 然后 我想知道是否有一个标准的 通用的解决方案来解
  • 面向对象的铸造错误[重复]

    这个问题在这里已经有答案了 将派生类强制转换为基类 我有一个通用的基本抽象类 继承自 IComparable 其定义如下 public abstract class BaseClass
  • MS Teams 应用程序:访问此应用程序时出现问题

    The users on MS Teams desktop reported multiple issues with our MS Teams app They see the following error on MS Teams De
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 有没有办法处理asp.net core odata错误

    有没有办法处理 asp net core odata 错误 我有一个模特班DimDateAvailable具有一个属性 主键为int DateId 然后我打电话 data DimDateAvailable select test 其他调用按
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解

随机推荐

  • jQuery Deferred 的 $.when() 和 failed() 回调参数

    使用时我得到了意想不到的结果 when 当其中一项延迟操作未成功时 以这个 JavaScript 为例 它创建了 2 个延迟 第一个成功 第二个失败 var f1 function return Deferred function dfd
  • jQuery UI 对话框链接而不是按钮

    我喜欢添加一个按钮 默认支持 并链接 jQuery UI 对话框 如何在 jQuery UI 对话框中添加链接 就我而言 我喜欢有 保存 按钮和 取消 链接 提前致谢 您必须按照您想要的方式设置按钮的样式 但这会注入一个链接并绑定单击 甚至
  • 如何在zendframework2中使用partial

    在ZF1中 我们在layout phtml文件中使用类似的部分 this gt partial header phtml array vr gt zf2 我们如何在 ZF2 中做到同样的事情 这可以通过以下方式实现 echo this gt
  • Python 导入错误“DLL 加载失败”| Python

    我正在 IIS6 Web 服务器后面提供 Django 应用程序 测试服务器运行完美 但是当在 Web 服务器后面运行时 模块无法导入 我收到此错误 加载 pyodbc 模块时出错 DLL加载失败 找不到指定的模块 只是为了记录该模块是py
  • Stack Overflow 桌面通知如何工作?

    也许这是一个相当大且模棱两可的问题 在 Stack Overflow 聊天室中 有一个 启用桌面通知 按钮 当有人回复您时 系统托盘中会显示一些内容 这是通过什么机制起作用的 这一直让我很好奇 网站如何访问系统托盘 它使用Notificat
  • javascript 循环中的承诺或如何一对一调用函数

    我和 slimerjs 一起工作 所以我有一个包含 url 和函数 foo 的数组 它可以用一个 url 来制作一些东西 该函数返回 Promise 如果我做这样的事情就可以了 foo urls then foo orError then
  • “只读...”类型的参数不可分配给“...[]”类型的参数

    有一个类似的问题 但与我在这里发现的问题不同 类型的参数不可分配给 类型的参数 TS 2345 https stackoverflow com questions 54298051 argument of type is not assig
  • 如何在具有 Decimal 类型值的 pandas TimeSeries 上使用mean方法?

    我需要将 Python 十进制类型值存储在 pandas 中TimeSeries DataFrame目的 在 TimeSeries DataFrame 上使用 groupby 和 mean 时 Pandas 给我一个错误 以下基于浮动的代码
  • 将 ASP.NET MVC 混合到 ASP.NET WebForms 中

    由于某种原因 我的路由忽略了任何访问我的 MVC 页面的尝试 只是给了我 404 我有一个 WebForms 应用程序设置如下 虚拟目录 东西 所以我通常像这样访问我的网站 http localhost thing someFile asp
  • 为什么不总是使用 fpic(位置无关代码)? [复制]

    这个问题在这里已经有答案了 I read this https stackoverflow com questions 5311515 gcc fpic option在 PIC 上发帖 似乎使用 PIC 总是好的 无论何时它是 exe 静态
  • R 3.0.0 更新导致大量 2.x 软件包不兼容

    今天早上我在 Ubuntu 10 04 上更新了一些 R ubuntu 软件包 然后我尝试的第一个 R 脚本告诉我 Zoo 不是为 R 3 0 0 构建的 所以我这样做sudo R进而update packages ask F 假设它会使我
  • 如何使用 Jasmine 监视在另一个方法中创建的对象?

    给定以下代码片段 您将如何创建一个Jasmine http jasmine github io 2 0 introduction html spyOn测试以确认doSomething当你跑步时被呼叫MyFunction function M
  • Visual Studio Code 中的方法列表

    我最近开始使用 Visual Studio Code 编辑器 我真的很喜欢它 但是 对我来说 有一个关键功能我还没有找到 是否有一个方法列表 类似于 NetBeans 中的导航器或 Visual Studio 中的成员下拉列表 Yes th
  • 自定义 iPhone 返回键文本

    是否可以设置自定义返回键类型UITextField txtField setReturnKeyType UIReturnKeyDefault 我想用 SHARE 一词代替返回键类型 Thanks 没有 您可以获得操作系统中定义的返回键和键盘
  • Websocket 多通道与单通道 + 服务器端处理 [GroupChat]

    假设我们想要创建私人聊天室 用户可以在其中进行小组聊天 一个用户可以加入多个 x组 在每种情况下 我都需要在服务器上创建一个唯一的组并向用户订阅这些组 哪种方法是推荐的 性能更高的方法 1 在服务器端 我创建一个 Room 类并添加新房间c
  • 根据另一个关联数组的值构建关联数组

    我正在寻找一种优雅的方式来转动这个数组 Array foo gt 1 bar gt 1 zim gt 3 dib gt 6 gir gt 1 gaz gt 3 进入这个数组 Array 1 gt Array foo bar gir 3 gt
  • 移动跨平台开发的限制[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 目前 我计划将 Java 桌面应用程序移植到 Android 平台 除了官方安卓软件开发工具包 http developer andr
  • 使用 C# 和 JScript 汇总表

    我用 C 编写了代码来总结以下值InvoiceTable并将这些汇总值移至GroupTable在 Abbyy FlexiCapture 中 该软件比较新 运行时没有显示任何错误 需要写两套代码 在科技领域 在事件处理程序中 InvoiceT
  • vuetify中关闭芯片时如何停止选择打开?

    对于来自 vuetify com 的示例 使用芯片自动完成 当我取消芯片时 如何让它不打开选择菜单 i tried click stop 但它不起作用 芯片上事件 Thanks 我发现如果你删除box来自你的支撑v autocomplete
  • .NET Core 中带参数的自定义 JsonConverter

    我编写了自己的 JsonConverter 使用 ASP Net Core 3 1 打算在我的 DTO 上使用它 在以前的版本中 Newtonsoft Json 您可以在自定义 JsonConverter 类上添加构造函数 并使用 Json