【问题标题】:System.Text.Json Custom JsonConverter never calledSystem.Text.Json 自定义 JsonConverter 从未调用
【发布时间】:2020-10-05 12:42:26
【问题描述】:

我想从 Newtonsoft 迁移一个 Asp 网络核心项目。我必须使用 JsonConverter 来保留一些旧功能。

正如我在docs 中所读到的,我尝试在属性、类型和启动时调用我的自定义转换器;它似乎从未被调用过。

我创建了一个示例项目,以确保它不是别的东西。如果转换器执行 Write 或 Read 方法,它应该抛出异常。但是到目前为止我还没有能够让它们执行。

这是转换器的代码

public class MyCustomConverter : JsonConverter<FooProp>
{
    public override FooProp Read(
        ref Utf8JsonReader reader,
        Type typeToConvert,
        JsonSerializerOptions options) => throw new NotImplementedException();

    public override void Write(
        Utf8JsonWriter writer,
        FooProp value,
        JsonSerializerOptions options) => throw new NotImplementedException();
}

控制器的代码

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    public WeatherForecastController()
    {
    }

    [HttpGet]
    public IActionResult Get()
    {
        return Ok(new FooClass());
    }

    public class FooClass
    {
        public string Always {get; set;}
        // Adds on property
        [JsonConverter(typeof(MyCustomConverter))]
        public FooProp Sometimes {get; set;}
    }

    // Adds on type
    [JsonConverter(typeof(MyCustomConverter))]
    public class FooProp
    {
        public string Something { get; set; }
    }
}

以及启动代码

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddControllers()
        .AddJsonOptions(options => {
            // Adds on startup
            options.JsonSerializerOptions.Converters.Add(new MyCustomConverter());
        });
}

.csproj

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
</Project>

看起来很简单,我一定是犯了一个明显的错误,但我已经有一段时间无法找到我做错了什么。

谁能帮帮我?

【问题讨论】:

  • 转换器永远不会被调用,因为FooClass.Sometimes 默认是null,而你从未分配过它。 WriteJson() 仅在非空值上调用。

标签: c# asp.net-core system.text.json


【解决方案1】:

我尝试在属性、类型和类型上调用我的自定义转换器 正如我在文档中阅读的那样,在启动时;它似乎从未被调用过。

那是因为你自定义的JsonConverter 继承了JsonConverter&lt;FooProp&gt; 只能转换FooProp 类:

public class MyCustomConverter : JsonConverter<FooProp>

您返回了新的 FooClass,它将创建 null Sometimes。 只需更改以下代码即可看到异常:

[HttpGet]
public IActionResult Get()
{
    //return Ok(new FooProp());
    return Ok(new FooClass { Sometimes = new FooProp() });
}

【讨论】:

  • 可以做到,但这只是部分原因。 new FooClass() 将导致 Sometimes 成为 null,因此不会调用转换器。如果您使用 new FooClass { Sometimes = new FooProp() }; 之类的内容,您也应该会看到异常。
  • 即使转换器中使用了泛型类型,它也没有被调用,所以我不确定这是唯一的原因
猜你喜欢
  • 2022-12-14
  • 1970-01-01
  • 2020-05-01
  • 2014-08-28
  • 2013-07-25
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多