JSON值无法转换为System.Int32

ali*_*nli 1 asp.net-core-webapi

我想将对象数据发送到我的Web API。api接受一个class参数,其属性是int和string的类型。

这是我的课:

public class deneme
    {
        public int ID { get; set; }
        public int sayi { get; set; }
        public int reqem { get; set; }
        public string yazi { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

这是我的json对象:

{
"id":0,
"sayi":"9",
"reqem":8,
"yazi":"sss"
Run Code Online (Sandbox Code Playgroud)

}

我希望api将属性“ sayi”读取为整数。但是由于无法显示,因此出现错误:无法将JSON值转换为System.Int32。路径:$。sayi

我该如何解决这个问题?

HRK*_*der 36

从 .NET 5 开始,有一个选项可以反序列化表示为 JSON 字符串的数字,而不是引发异常。

using System.Text.Json;
using System.Text.Json.Serialization;

var options = new JsonSerializerOptions()
{
     NumberHandling = JsonNumberHandling.AllowReadingFromString |
     JsonNumberHandling.WriteAsString
};

// serialize
string denemeJson = JsonSerializer.Serialize<Deneme>(deneme, options);

// deserialize
Deneme denemeDeserialized = JsonSerializer.Deserialize<Deneme>(denemeJson, options);
Run Code Online (Sandbox Code Playgroud)

  • @JhonHernández 你确定你正在使用 .NET 5 吗? (2认同)

Vah*_*idN 23

首先你应该JsonConverter为它创建一个:

using System;
using System.Buffers;
using System.Buffers.Text;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace sample_22_backend.Converters
{
    public class IntToStringConverter : JsonConverter<int>
    {
        public override int Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
        {
            if (reader.TokenType == JsonTokenType.String)
            {
                ReadOnlySpan<byte> span = reader.HasValueSequence ? reader.ValueSequence.ToArray() : reader.ValueSpan;
                if (Utf8Parser.TryParse(span, out int number, out int bytesConsumed) && span.Length == bytesConsumed)
                {
                    return number;
                }

                if (int.TryParse(reader.GetString(), out number))
                {
                    return number;
                }
            }

            return reader.GetInt32();
        }

        public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options)
        {
            writer.WriteStringValue(value.ToString());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在模型的属性上以这种方式使用它:

[JsonConverter(typeof(IntToStringConverter))]
public int GenreId { set; get; }
Run Code Online (Sandbox Code Playgroud)

或者您可以全局添加它:

services.AddControllers()
        .AddJsonOptions(options => 
                options.JsonSerializerOptions.Converters.Add(new IntToStringConverter()));
Run Code Online (Sandbox Code Playgroud)

  • 它不应该是 stringtointconvertor 吗? (2认同)

Tao*_*hou 10

对于Asp.Net Core 3.0,它System.Text.Json用于序列化和反序列化。

为了使用旧的行为,您可以通过引用Json.NET支持在ASP.NET Core 3.0项目中使用Json.NET

简短答案:

  1. 安装Microsoft.AspNetCore.Mvc.NewtonsoftJson哪个是预览版。
  2. 改成 services.AddControllers().AddNewtonsoftJson();

  • 很好,谢谢。问题是,为什么微软不能直接使用下载最多的 NuGet 包...... (2认同)
  • 它的效率或性能不那么高。Newtonsoft 是一个很棒的软件包,因为它涵盖了大量的用例。大量的使用转换会带来性能开销成本。微软非常专注于他们的产品。它是由 aspnetcore 的性能驱动的。 (2认同)
  • 我只需要走这条路就能让我的对象正确反序列化。由于某种原因,“Microsoft.AspNetCore.Mvc.NewtonsoftJson”没有显示在包管理器中,必须使用“Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.0.0”手动安装它。它将指示该软件包可以更新到 3.1.0,但它需要 net core 3.1,在撰写此评论时该软件包仍处于预发布状态。写这篇文章希望对遇到这个问题的其他人有所帮助! (2认同)

Cat*_*tea 7

.NET CORE 3.X序列化/反序列化过程中使用System.Text.Jsonnot完成Newtonsoft Json。爱德华的回答并不完全适合我:

  1. 从 Nuget Manager 安装Microsoft.AspNetCore.Mvc.NewtonsoftJson不会使第 2 步编译。
  2. 是的,添加启动services.AddControllers().AddNewtonsoftJson();- 您将收到一个错误,AddNewtonsoftJson()无法识别。

至少这发生在我身上。

作为修复,卸载您在步骤 1 中安装的内容。在包管理器控制台中,运行:Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.0.0-preview8.19405.7。这对我有用。