89 votes

La valeur JSON n'a pas pu être convertie en System.Int32

Je veux envoyer des données d'objet à mon API Web. L'API accepte un paramètre de classe, dont les propriétés sont de type int et string.

Voici ma classe :

public class deneme
{
   public int ID { get; set; }
   public int sayi { get; set; }
   public int reqem { get; set; }
   public string yazi { get; set; }
}

Voici mon objet JSON :

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

Je veux que l'API lise la propriété "sayi" en tant qu'entier. mais comme il ne peut pas, il donne l'erreur :

La valeur JSON n'a pas pu être convertie en System.Int32. Chemin : $.sayi

Comment pourrais-je résoudre ce problème ?

120voto

Tao Zhou Points 2866

Pour Asp.Net Core 3.0, il utilise System.Text.Json pour la sérialisation et la désérialisation.

Pour utiliser l'ancien comportement, vous pourriez utiliser Json.NET dans un projet ASP.NET Core 3.0 en référençant Json.NET support.

Réponse courte:

  1. Installer Microsoft.AspNetCore.Mvc.NewtonsoftJson qui est une version de prévisualisation.
  2. Changer en services.AddControllers().AddNewtonsoftJson();

46voto

HRKoder Points 431

À partir de .NET 5, il existe une option pour désérialiser des nombres représentés sous forme de chaînes JSON au lieu de déclencher une 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, options);

// deserialize
Deneme denemeDeserialized = JsonSerializer.Deserialize(denemeJson, options);

30voto

VahidN Points 3905

Tout d'abord, vous devez créer un JsonConverter pour cela :

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
    {
        public override int Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
        {
            if (reader.TokenType == JsonTokenType.String)
            {
                ReadOnlySpan 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());
        }
    }
}

Ensuite, utilisez-le de cette manière sur les propriétés de votre modèle :

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

Ou vous pouvez l'ajouter globalement :

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

10voto

Cata Hotea Points 448

Dans .NET CORE 3.X, le processus de sérialisation/désérialisation est effectué en utilisant System.Text.Json et non Newtonsoft Json. La réponse d'Edward n'a pas fonctionné entièrement pour moi :

  1. L'installation depuis Nuget Manager de Microsoft.AspNetCore.Mvc.NewtonsoftJson ne permet pas d'effectuer l'étape 2.
  2. Oui, ajoutez dans le fichier Startup services.AddControllers().AddNewtonsoftJson(); - vous recevrez une erreur, AddNewtonsoftJson() non reconnu.

En tout cas, c'est ce qui s'est passé pour moi.

Comme solution, désinstallez ce que vous avez installé à l'étape 1. Dans la console du gestionnaire de packages, exécutez : Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson -Version 3.0.0-preview8.19405.7. Cela a fonctionné pour moi.

4voto

Anglesvar Points 841

Mieux analyser les valeurs en Entier et envoyer les données à l'application côté serveur depuis votre application côté client, cela a fonctionné pour moi. Happy Coding!!

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X