我正在将旧的ASP.NET Web API升级到最新的ASP.NET Core Win API.然而,我现在遇到了空对象和空值.我们的网站所有者发送空的JSON对象和值为"",他们不打算更改...

例如:

{
    "user": "",
    "subscription": {
        "id": 123456789,
        "origin": "",
        "verlenging": true
    },
    "voucher": {
        "name": "",
        "id": 0
    },
    "webLinkId": ""
}

其他时候他们是这样发送的

{
    "user": {
        "isDomi": true,
        "isStudent": false,
        "isWeightPromotion": true,
        "startDate": "02/11/2023",
        "weight": 90,
        "firstname": "Test",
        "lastname": "Test",
        "email": "test@test.be",
        "telephone": "123456789",
        "birthday": "",
        "gdpr": true,
        "weblink": "",
        "language": "en",
        "klantId": "",
        "type": "",
        "CommercialContact": false
    },
    "subscription": {
        "id": 123456789,
        "origin": "",
        "verlenging": false
    },
    "voucher": {
        "name": "",
        "id": 0
    },
    "webLinkId": 123456789
}

这意味着我的代码必须能够将空字符串转换为空或0,并在必要时进行解析,我应该如何做呢?

我试过使用属性和转换器,但它们似乎不起作用,或者我做错了,有人能告诉我如何处理这个问题吗?

目前的主要错误是:

无法将JSON值转换为...

推荐答案

在ASP.NET Core中处理混合了空字符串和实际null或零的JSON数据时,可以创建自定义JSON转换器来处理格式化过程以适应这些混合类型.以下是你如何处理它:

创建自定义转换器:

对于可以为空的值类型(如int?、bool?等),您可以创建一个转换器来判断字符串是否为空,如果为空,则返回NULL;否则,它将try 解析该值. 对于引用类型(如字符串),您可以创建一个将空字符串视为空的转换器. 配置JsonSerializerOptions:

在Startup.cs中或配置服务的任何地方,将这些转换器添加到系统在反序列化时使用的JsonSerializerOptions.

public class EmptyStringToNullConverter : JsonConverter<string>
{
    public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.String && reader.GetString() == "")
        {
            return null;
        }
        return reader.GetString();
    }

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

public class EmptyStringToZeroConverter : JsonConverter<int>
{
    public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.String && reader.GetString() == "")
        {
            return 0;
        }
        return reader.GetInt32();
    }

    public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options)
    {
        writer.WriteNumberValue(value);
    }
}

在注册服务时,将以下内容添加到Program或Startup类中

  builder.Services.AddControllers().AddJsonOptions(options =>
  {
      options.JsonSerializerOptions.Converters.Add(new EmptyStringToNullConverter());
      options.JsonSerializerOptions.Converters.Add(new EmptyStringToZeroConverter());
  });

Csharp相关问答推荐

Serilog SQL服务器接收器使用UTC作为时间戳

将修剪声明放入LINQ中

如何在NServicebus中配置学习传输的文件夹(NService bus 8)

通过条件列表删除/更新EF Core 7中的实体的有效方法

dotnet集合中内部数组的局部变量副本的用途是什么?'

碰撞检测与盒碰撞器,其isTrigger on问题

UWP中的任务和界面

为什么Regex.IsMatch(";\\t";,";\\t";)返回FALSE而不是TRUE?

如何在ASP.NET Core8中启用REST应用程序的序列化?

从VS调试器而不是测试资源管理器运行的调试NUnitDotNet测试

EF核心区分大小写的主键

Lambda表达式如何与隐式强制转换一起工作?

使用CollectionView时在.NET Maui中显示数据时出现问题

.Net MAUI,在将FlyoutPage添加到容器之前,必须设置添加构造函数导致Flyout和Detail"

如何在发布NuGet包之前设置命名空间?

ASP.NET MVC数据批注验证组复选框

如何解决System.StackOverflowException:抛出System.StackOverflowException类型的异常.&# 39;生成随机代码时发生异常?

HttpClient,上传文件时实现进度

如何获取我在SQL中输入的值

无法通过服务控制台启动.NET Core 6.0服务(错误1053)