330 votes

Comment renvoyer du JSON camelcase sérialisé par JSON.NET à partir des méthodes du contrôleur ASP.NET MVC ?

Mon problème est que je souhaite renvoyer des données JSON en camelCase (par opposition au PascalCase standard) via ActionResult à partir des méthodes de contrôleur ASP.NET MVC, sérialisées par JSON.NET.

Comme exemple, prenez la classe C# suivante :

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Par défaut, lorsqu'on renvoie une instance de cette classe à partir d'un contrôleur MVC en JSON, elle sera sérialisée de la manière suivante :

{
  "FirstName": "Joe",
  "LastName": "Public"
}

Je voudrais qu'elle soit sérialisée (par JSON.NET) comme :

{
  "firstName": "Joe",
  "lastName": "Public"
}

Comment puis-je faire cela ?

6voto

Ali Alp Points 305

J'ai fait comme ceci :

public static class JsonExtension
{
    public static string ToJson(this object value)
    {
        var settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            NullValueHandling = NullValueHandling.Ignore,
            ReferenceLoopHandling = ReferenceLoopHandling.Serialize
        };
        return JsonConvert.SerializeObject(value, settings);
    }
}

C'est une simple méthode d'extension dans MVC core, elle va donner la capacité ToJson() à chaque objet de votre projet. À mon avis, dans un projet MVC, la plupart des objets devraient avoir la capacité de devenir json, bien sûr, cela dépend :)

1voto

Evgeny Points 11

Depuis .net core et à partir de .net5, .net6, .net7, .net8 ASP .NET Core utilise System.Text.Json.JsonSerializer au lieu de la bibliothèque NewtonSoft, donc les réponses initiales de @aknuds1 et @silvio ne sont plus à jour.

Pour configurer la conversion des noms de propriété:

////Dans Program.cs ou dans des sous-modules, lors de la configuration des services au démarrage :
services
  .AddJsonOptions(options =>
  {
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
    ////Et d'autres options par exemple pour les énumérations :
    //options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase));
    ////et pour DateOnly nous pouvons enregistrer un convertisseur personnalisé :
    //options.JsonSerializerOptions.Converters.Add(new DateOnlyJsonConverter());
  });

////Puis dans le contrôleur :
[HttpGet]
public async Task FooMethod(CancellationToken cancellationToken)
{
    var data = await GetData(cancellationToken);

    return Ok(data);
}

Pour convertir manuellement en chaîne Json :

var jsonSerializerOptions = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};
jsonSerializerOptions.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase));
////Et d'autres paramètres comme :
//jsonSerializerOptions.Converters.Add(new DateOnlyJsonConverter());

var jsonStr = System.Text.Json.JsonSerializer.Serialize(data, jsonSerializerOptions);

Exemple de convertisseur personnalisé :

//Valable pour .net6 si votre DTO contient un champ DateOnly
public class DateOnlyJsonConverter : JsonConverter
{
    private const string Format = "yyyy-MM-dd";

    public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var str = reader.GetString();
        return string.IsNullOrEmpty(str)? default : DateOnly.ParseExact(str, Format, CultureInfo.InvariantCulture);
    }

    public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString(Format, CultureInfo.InvariantCulture));
    }
}

0voto

LukePerrin Points 105

Si vous renvoyez un ActionResult dans une API web .net core, ou un résultat IHttpAction alors vous pouvez simplement envelopper votre modèle dans une méthode Ok() qui correspondra au cas sur votre front end et le sérialisera pour vous. Pas besoin d'utiliser JsonConvert. :)

-3voto

Yanshof Points 2583

Installer le package Microsoft.AspNetCore.Mvc.NewtonsoftJson

cela résout mon problème

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