【问题标题】:.Net Core 3.1 Controller result ignore certain properties if null and not requested.Net Core 3.1 控制器结果忽略某些属性,如果为空且未请求
【发布时间】:2021-08-20 11:23:43
【问题描述】:

假设我们有这样的数据结构:

public class Foo 
{
  public string Name {get; set;}
  public Bar Bar {get; set;}
}
public class Bar
{
  public string Data {get; set;}
  public string Format {get; set;}
}

现在在控制器中通过 API 最终用户可以请求 Bar 数据,但这不是强制性的(可以说检索起来非常昂贵)。

如果不请求 Bar,我希望结果是这样的

{
  "Name": "Test"
}

如果我们还要在结果中请求 Bar 并假设它为 null,我想返回类似的内容。

{
  "Name": "Test",
  "Bar": {
     "Data": null,
     "Format": null
  }
}

这在 .Net Core 3.1 中可行吗?

【问题讨论】:

  • 你的请求是如何形成的?
  • 当你设置一个新的 asp 项目时,我正在使用开箱即用的东西。但现在我尝试使用基本序列化程序添加自定义过滤器:SystemTextJsonOutputFormatter()

标签: c# asp.net .net-core


【解决方案1】:

一种方法是为您的Foo 类使用自定义转换器。像这样的例子

public class FooJsonConverter : JsonConverter<Foo>
{
    public override Foo Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        throw new NotImplementedException();
    }

    public override void Write(Utf8JsonWriter writer, Foo value, JsonSerializerOptions options)
    {
        writer.WriteStartObject();

        writer.WriteString("Name", value.Name);
        writer.WritePropertyName("Bar");
        if (value.Bar == null)
        {
            value.Bar = new Bar();

        }
        JsonSerializer.Serialize(writer, value.Bar, options);
        writer.WriteEndObject();
    }
}

那么你可以通过这些选项在 mvc 中使用自定义转换器

services.AddControllers().AddJsonOptions(options => {
            options.JsonSerializerOptions.Converters.Add(new FooJsonConverter());
        });

【讨论】:

    【解决方案2】:

    您将不得不使用 jtoken ,将对象转换为 JToken,RemoveEmptyChildren 函数将递归调用以找出空属性并仅加载具有值在 jobject link 的属性

    【讨论】:

    • 这是一个仅链接的答案。还请说明如何使用 jtoken 来实现 OPs 要求。
    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 2017-08-08
    • 2015-03-22
    • 2017-10-08
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多