【发布时间】:2021-10-11 02:02:14
【问题描述】:
我无法让依赖注入在 .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()}");
}
}
用法:
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。
感谢任何帮助,谢谢。
编辑 1:
我从 StackOverflow 查了很多答案,但到目前为止没有一个对我有用。他们中的大多数都已经过时了,或者缺少一些东西来使其正常工作。其中很少有我已经检查过但对我不起作用:
- Cannot replace default JSON contract resolver in ASP.Core 3
- Custom JsonConverter with parameters in .NET Core
- https://www.newtonsoft.com/json/help/html/DeserializeWithDependencyInjection.htm
- .Net Core Api - Custom JSON Resolver based on Request Values
- http://www.dotnet-programming.com/post/2017/05/07/Aspnet-core-Deserializing-Json-with-Dependency-Injection.aspx
编辑 2:我尝试了建议作为重复参考的帖子,但它在我的情况下不起作用。
https://stackoverflow.com/questions/53288633/net-core-api-custom-json-resolver-based-on-request-values
我尝试过转头和其他各种选择,但没有运气。
James(日期:2108)建议的解决方法之一没有奏效。
参考: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));
}
}
在您的启动中注册它们 ervices.AddSingleton
() (不记得是否默认注册了 IHttpContextAccessor 所以 您可能还需要注册那个) 然后在您的 Read/WriteJson 方法中使用 _accessor.HttpContext 来 访问请求的上下文
【问题讨论】:
-
这方面有很多问题和答案,没有一个对你有用吗?
-
@TheGeneral - 是的,我做到了。用一些参考更新了我的问题。
-
This answer 从
MvcJsonOptions适当更改为MvcNewtonsoftJsonOptions对您不起作用? -
作为替代方案,这可能对您有用:Pass additional data to JsonConverter。
-
@SunnySharma 我需要将依赖项注入到我的自定义
JsonConverter实现中,它不能有非默认构造函数,否则会导致异常。你的答案反过来使用了一个自定义的ContractResolver,它显然可以有一个非默认的构造函数——所以我们的个人问题有点不同。我在下面发布了我的答案。它基于 Thomas 的 hack,但稍作修改以处理我的特定设置。
标签: c# asp.net-core json.net