JSON值无法转换为System.Int32

时间:2019-08-23 13:01:46

标签: 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; }
    }

这是我的json对象:

{
"id":0,
"sayi":"9",
"reqem":8,
"yazi":"sss"

}

我希望api将属性“ sayi”读取为整数。 但是因为它不能,所以给出了错误: JSON值无法转换为System.Int32。路径:$。sayi

我该如何解决这个问题?

8 个答案:

答案 0 :(得分:15)

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

要使用旧行为,您可以通过引用Json.NET support在ASP.NET Core 3.0项目中使用Json.NET。

简短答案:

  1. 安装Microsoft.AspNetCore.Mvc.NewtonsoftJson,这是预览版。
  2. 更改为services.AddControllers().AddNewtonsoftJson();

答案 1 :(得分:4)

.NET CORE 3.X中,序列化/反序列化过程是使用System.Text.Json而非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。这对我有用。

答案 2 :(得分:1)

首先,您应该为其创建一个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());
        }
    }
}

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

[JsonConverter(typeof(IntToStringConverter))]
public int GenreId { set; get; }

或者您可以将其全局添加:

services.AddControllers()
        .AddJsonOptions(options => 
                options.JsonSerializerOptions.Converters.Add(new IntToStringConverter()));

答案 3 :(得分:1)

在js模型中,确保您的值的格式设置为parseFloat();

答案 4 :(得分:1)

还有另一种方法:只需使用数字类型的类型字符串创建DTO,然后将其转换为控制器或所需的类型即可。

答案 5 :(得分:0)

更好地将值解析到Integer并将数据从您的客户端应用程序发送到服务器端应用程序,这对我有用。 快乐编码!

{
  "id":parseInt(0),
  "sayi":parseInt(9),
  "reqem":parseInt(8),
  "yazi":"sss"
 }

答案 6 :(得分:0)

从 .NET 5 开始,有一个 option to deserialize numbers 表示为 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);

答案 7 :(得分:-1)

在.net core中可能会遇到这个问题,你可以将数据类型从int改为int64