The JSON value could not be converted to System.Int32
Solution 1:
For Asp.Net Core 3.0, it uses System.Text.Json
for serialization and deserialization.
For using old behavior, you could use Json.NET in an ASP.NET Core 3.0 project by referencing Json.NET support.
Short Answer:
- Install
Microsoft.AspNetCore.Mvc.NewtonsoftJson
which is preview version. - Change to
services.AddControllers().AddNewtonsoftJson();
Solution 2:
First you should create a JsonConverter
for it:
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());
}
}
}
Then use it this way on your model's properties:
[JsonConverter(typeof(IntToStringConverter))]
public int GenreId { set; get; }
Or you can add it globally:
services.AddControllers()
.AddJsonOptions(options =>
options.JsonSerializerOptions.Converters.Add(new IntToStringConverter()));
Solution 3:
Starting in .NET 5, there is an option to deserialize numbers that are represented as JSON strings instead of throwing an exception.
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);
Solution 4:
In .NET CORE 3.X
the serialize/deserialize process is done using System.Text.Json
not Newtonsoft Json
. Edward's answer did not work entirely for me:
- Installing from Nuget Manager
Microsoft.AspNetCore.Mvc.NewtonsoftJson
won't make step 2 to compile. - Yes, add in Startup
services.AddControllers().AddNewtonsoftJson();
- you will receive an error,AddNewtonsoftJson()
not recognized.
At least this happened to me.
As a fix, uninstall what you've installed at step 1. In package manager console, run: Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.0.0-preview8.19405.7
. This worked for me.