51 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 parce qu'il ne peut pas, il donne l'erreur:

 The JSON value could not be converted to System.Int32. Path: $.sayi

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

19voto

VahidN Points 3905

Vous devez d'abord 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<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());
        }
    }
}

Ensuite, utilisez-le de cette façon 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()));

1voto

Moustachio Points 106

dans le modèle js, assurez-vous que vos valeurs sont au format parseFloat();

1voto

Alejandro Points 75

Il existe un autre moyen : créez simplement un DTO avec la chaîne de type pour les types numériques et convertissez-le en contrôleur ou en type dont vous avez besoin.

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