web-dev-qa-db-fra.com

Jsonserializer.deserialize échoue

Considérez le code ...

using System;
using System.Text.Json;

public class Program
{
    public static void Main()
    {
        int id = 9;
        string str = "{\"id\": " + id + "}";
        var u = JsonSerializer.Deserialize<User>(str);
        Console.WriteLine($"User ID: {u.Id}, Correct: {id == u.Id}");  // always 0/init/default value
    }
}


public class User {
    public int Id { get; set; }
}

Pourquoi les données ne sont-elles pas désérialisées correctement dans l'objet User? J'ai également vérifié le comportement via DotNetFiddle au cas où il s'agissait d'un problème local à mon système. Aucune exception n'est lancée.

Ma mise en œuvre réelle est lue à partir d'un [ApiController] 'S [HttpPost] Action après i return Created("user", newUser). Il est appelé dans mon projet MVC/RAZOR via _httpClient.PostAsync. J'ai vérifié les valeurs correctes lorsque Created _ est renvoyé à l'appel PostAsync _ appel, mais quoi que ce soit, la valeur analysée à partir du corps de réponse ne contient que des valeurs par défaut (l'ID réel est un Guid).

J'ai initialement pensé que cela aurait pu être un problème connexe de l'UTF8, car c'est le codage pour le StringContent i poster sur ApiController. UTF8 La désérialisation est référencée ici , mais j'ai eu du mal à obtenir de l'io.stream du HttpContent à un ReadOnlySpan ou Utf8JsonReader.

J'ai trouvé ce projet en recherchant, ce qui me fait penser que cela devrait fonctionner comme prévu.

6
t.j.

Merci à MR5 Qui a suggéré qu'il s'agissait d'un problème de boîtier via chat .

Changer la chaîne pour utiliser TitLecase ("ID") résout le problème.

J'étais en train de soumettre un ticket et l'un des éventuellement des problèmes liésCommentaires mène-moi à un autre problème , qui conduit à la documentation, qui a une solution

var options = new JsonSerializerOptions();
options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;

En utilisant les options, résout le problème ...

string str = "{\"id\": " + id + "}";
var options = new JsonSerializerOptions();
options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
var u = JsonSerializer.Deserialize<User>(str, options);

Laissant tout cela au cas où cela aide quelqu'un d'autre.

1
t.j.

Dans ConfigureServices à Startup.cs

services.AddControllers()
        .AddJsonOptions(o => {
            o.JsonSerializerOptions.PropertyNamingPolicy=JsonNamingPolicy.CamelCase;
            o.PropertyNameCasInsensitive=true
        });
0
Rdwan Alali