如何在.NET Core 3.1中的Newtonsoft JsonConverter中注入依赖

2023-12-06

我无法让依赖注入在 .NET Core 3.1 中为以下 Newtonsoft JsonConverter 工作。

我只想在属性级别使用它,而不是在全局级别使用它。因此,只有当指定的属性来自某个类时才应执行。

JsonConverter:

public class HelloWorldCustomConverter : JsonConverter<string>
{
    private readonly IMyService _myService;

    public HelloWorldCustomConverter(IMyService myService)
    {
        _myService = myService;
    }
    public override bool CanRead => false;
            
    public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer)
    {
        // append a value using the injected service
        writer.WriteValue($"{value}-{myService.GetValue()}");
    }
}

Usage:

public class MyClass
{   
    public string Title {  get; set; }

    [JsonConverter(typeof(HelloWorldCustomConverter))]
    public string Details {  get; set; }
}

它是 .NET Core 3.1 和 Newtonsoft.json 版本 13.0.1。

我很感激任何帮助,谢谢。

Edit 1

我从 StackOverflow 检查了很多答案,但到目前为止没有一个对我有用。它们中的大多数都相当过时,或者缺少一些东西来使其正常工作。其中很少有我已经检查过但对我不起作用的:

  • 无法替换 ASP.NET Core 3 中的默认 JSON 合约解析器
  • .NET Core 中带参数的自定义 JsonConverter
  • https://www.newtonsoft.com/json/help/html/DeserializeWithDependencyInjection.htm
  • .Net Core Api - 基于请求值的自定义 JSON 解析器
  • http://www.dotnet-programming.com/post/2017/05/07/Aspnet-core-Deserializing-Json-with-Dependency-Injection.aspx

Edit 2

我尝试了建议作为重复参考的帖子,但它在我的情况下不起作用。

  • .Net Core Api - 基于请求值的自定义 JSON 解析器

我尝试旋转我的头和各种其他选择,但没有运气。

James 建议的解决方法之一(日期:2108)没有起作用。

Ref: https://github.com/JamesNK/Newtonsoft.Json/issues/1910

你可以尝试类似的东西

public class JsonOptions : IConfigureOptions<MvcJsonOptions>
{
    IHttpContextAccessor _accessor;

    public JsonOptions(IHttpContextAccessor accessor)
    {
        _accessor = accessor;
    }

    public virtual void Configure(MvcJsonOptions options)
    {
        options.SerializerSettings.Converters.Add(new MyCustomConverter(_accessor));
    }
}

在您的启动中注册它

services.AddSingleton<IConfigureOptions<MvcJsonOptions>, JsonOptions>()

(不记得 IHttpContextAccessor 是否默认注册,因此您可能还需要注册该访问器)

然后在 Read/WriteJson 方法中使用 _accessor.HttpContext 访问请求的上下文


从评论里的评论来看托马斯的博客文章你已经尝试过他的方法了。无论您是否设法让它工作,我都会发布我在尝试实施 Thomas 的 hack 时遇到的问题的解决方案 - 也许这会对其他人有所帮助。

在我的设置中自定义JsonConverter实际上并不是由MVC框架直接实例化的,而是通过Newtonsoft的间接实例化的JToken.ToObject(),这会创建一个JsonSerializer默认情况下JsonSerializerSettings。再向下ToObject()的调用链,我的习惯JsonConverter使用这些默认设置进行实例化。

TL;DR;为了让托马斯的黑客工作,我需要改变IConfigureOptions<MvcNewtonsoftJsonOptions>.Configure()'的实施:

public void Configure(MvcNewtonsoftJsonOptions options)
{
    JsonConvert.DefaultSettings = () =>
    {
        var settings = new JsonSerializerSettings();
        settings.Converters.Add(new ServiceProviderDummyConverter(_httpContextAccessor, _serviceProvider));
        return settings;
    };
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在.NET Core 3.1中的Newtonsoft JsonConverter中注入依赖 的相关文章

  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • Rx.NET 中是否有一个Subject 实现,其功能类似于BehaviourSubject,但仅在值发生更改时才发出?

    有没有Subject https learn microsoft com en us previous versions dotnet reactive extensions hh229699 v vs 103 Rx NET 中的实现在功能
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • 无法通过docker连接到ASP.NET Core

    大家好 人们已经关注这个问题太久了 需要一些帮助 我制作了一个 ASP NET Core 网站 没有什么特别的 只是 VS 2017 v 1 1 附带的模板 我使用 dotnet core cli 发布网站并使用此 dockerfile 构
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • 使用 C 求解矩阵(在 CUDA 内)

    作为更大问题的一部分 我需要解决小型线性系统 即 NxN 其中 N 10 因此使用相关的 cuda 库在速度方面没有任何意义 不幸的是 我们还不清楚如何在不使用 GSL EIGEN 等大佬的情况下解决此类系统 谁能给我指出直 C 中稠密矩阵
  • 如何在 Mongoose 中执行 upsert 查找嵌入文档?

    SocialProfileSchema new mongoose Schema source type String enum twitter facebook lowercase true user id String profile u
  • 禁止从 dojo/request 向浏览器控制台写入错误

    有谁知道如何在执行 dojo request 时抑制浏览器控制台中显示的错误 例如 我向后端发出一个 post 请求 该请求返回 HTTP 400 告诉我由于验证检查而发生了错误 我将在我的代码中适当地处理它 显示一些验证警告 但 dojo
  • 在数据框中查找每个月的最后一个日期

    我一直在工作中遇到一个问题 我有一个日期数据集 采用数据框格式 我需要搜索并找到每个月的最后一天并将它们放入新的数据框中 下一列中还有一个与之相关的值 这是日期的样本 1 2015 05 21 2015 05 20 2015 05 19 2
  • 使用app sdk登录Rally

    如何使用 app sdk 以编程方式登录 Rally 我在拉力赛之外使用它 它首先重定向到登录页面 我想在没有用户输入凭据的情况下登录 Rally 有一个称为 LoginKey 的工具 可用于帮助对应用程序进行外部身份验证 如果您想在不登录
  • 如何在pygame中上下移动一个盒子[矩形作为正方形]?

    我正在尝试上下移动一个盒子pygame 我可以用钥匙向左移动盒子a并右键使用d 我怎样才能上下移动它 我的代码 import sys import pygame as pg def main screen pg display set mo
  • Vuejs 和数据表:使用 v-for 填充数据时表为空

    我正在尝试使用 vuejs v for 指令和 ajax 来填充数据表来获取数据 但该表始终显示 表中没有可用数据 即使显示了一些数据 并且底部还显示 显示 0 到0 个条目 共 0 个条目 我猜这是因为 vuejs 是反应性的 表格可能无
  • 将页脚置于底部

    我想将页脚放置在页面底部 例如 在内容不多的页面上 我仍然需要底部的页脚 但如果内容长于页面的高度 则必须将页脚向下推 可以仅使用 CSS 来完成还是需要添加一些 jQuery 魔法 您应该使用其中之一粘页脚技巧
  • JUnit 测试用例在 eclipse 中通过,但在 Maven 构建中失败

    我使用 spring 为 JPA 编写了一个 JUnit 测试用例 测试用例在 eclipse 中通过 但是如果我使用 maven mvn test 执行相同的测试用例 它就会失败 我的测试用例是 import javax annotati
  • _IDTExtensibility2,什么DLL导入到ATL项目中?

    所以我正在努力解决我的问题Office 插件再次任务 我已经创建了ATL项目 添加了简单的类 现在想要添加接口实现 如下http www devarticles com c a Cplusplus Writing an MS Word Ad
  • 释放数据库中库存的最佳实践

    我正在构建一个售票应用程序 用于跟踪门票库存 并在特定门票售完时停用它们 我想知道当订单中途放弃时将库存释放回商店的最佳做法是什么 目前的流量 用户添加items to an order as line items和order付款成功后标记
  • 如何动态添加edittext到android

    我想将 edittext 动态添加到 android 显示 我想做一些类似于 Android 联系人的东西 您可以在其中动态添加字段并在不需要时删除它们 感谢您的帮助 动态查看一切 TextView tv new TextView this
  • printf 中 double 的正确格式说明符

    正确的格式说明符是什么double在 printf 中 是吗 f或者是 lf 我相信这是 f 但我不确定 代码示例 include
  • 如何将nif流文件从1.12版本迁移到1.16.3

    我有一个在 NiFi 1 12 0 中运行的数据流 此安装的相关属性如下 nifi sensitive props key nifi sensitive props key protected nifi sensitive props al
  • .net实体框架与oracle 11g

    我正在将实体框架与 Oracle 提供程序 Oracle ManagedDataAccessDTC 一起使用 从 Visual Studio 运行一切正常 但是当我将其发布到 IIS 时 我收到连接错误异常 这是我的 webconfig 女
  • 使用 dplyr 从数据帧中采样子组行

    如果我想从不同组中随机选择一些样本 我使用 plyr 包和下面的代码 require plyr sampleGroup lt function df size df sample nrow df size size iris sample
  • 跟踪 Android 应用程序内的用户空闲时间

    据我所知 没有系统API可供我获取用户空闲时间 当我说用户空闲时间时 我的意思是用户在我的应用程序内的触摸屏上进行一些交互 因此 我想自己跟踪它 我想到的方法是扩展Activity并覆盖onuserinteraction方法来保存最后用户活
  • 图像上传后,React Native 中仅 iOS 的图像 uri 为空

    在我的 React Native 应用程序中 我添加了上传多个图像的功能 这些图像将存储为 image 包括 uri 这对于 Android 来说非常有效 但对于iOS来说 创建的image 也包含一些数据 但与android完全不同 对于
  • 从“.exe”中删除调试信息[重复]

    这个问题在这里已经有答案了 如果我将 C 程序 exe 放入文本编辑器中 我可以在其中找到调试信息 我怎样才能删除它 编辑 我不关心 pdb 文件 我只关心可执行文件中有 pdb 文件的路径 该路径包含我的名字 在本例中是巧合 我的问题是如
  • 如何在.NET Core 3.1中的Newtonsoft JsonConverter中注入依赖

    我无法让依赖注入在 NET Core 3 1 中为以下 Newtonsoft JsonConverter 工作 我只想在属性级别使用它 而不是在全局级别使用它 因此 只有当指定的属性来自某个类时才应执行 JsonConverter publ