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 ?

13voto

Stuart Hallows Points 766

Une alternative au filtre personnalisé est de créer une méthode d'extension pour sérialiser n'importe quel objet en JSON.

public static class ObjectExtensions
{
    /// Sérialise l'objet en une chaîne JSON.
    /// Une représentation en chaîne JSON de l'objet.
    public static string ToJson(this object value)
    {
        var settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            Converters = new List { new StringEnumConverter() }
        };

        return JsonConvert.SerializeObject(value, settings);
    }
}

Ensuite, appelez-la lors du retour de l'action du contrôleur.

return Content(person.ToJson(), "application/json");

13voto

jwize Points 823

Plus simple est mieux à mon avis!

Pourquoi ne pas faire ça?

public class CourseController : JsonController
{
    public ActionResult ManageCoursesModel()
    {
        return JsonContent();
    }
}

Le contrôleur de base simple

public class JsonController : BaseController
{
    protected ContentResult JsonContent(Object data)
    {
        return new ContentResult
        {
            ContentType = "application/json",
             Content = JsonConvert.SerializeObject(data, new JsonSerializerSettings { 
              ContractResolver = new CamelCasePropertyNamesContractResolver() }),
            ContentEncoding = Encoding.UTF8
        };
    }
}

12voto

Daniel Sánchez Points 199

Vous devez définir les paramètres dans le fichier 'Startup.cs'

Vous devez également le définir dans les valeurs par défaut de JsonConvert, c'est si vous voulez ensuite utiliser directement la bibliothèque pour sérialiser un objet.

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
            .AddJsonOptions(options => {
                options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
                options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            });
        JsonConvert.DefaultSettings = () => new JsonSerializerSettings
        {
            NullValueHandling = NullValueHandling.Ignore,
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
    }

9voto

DanKodi Points 540

Voici une méthode d'action qui retourne une chaîne json (camelCase) en sérialisant un tableau d'objets.

public string GetSerializedCourseVms()
    {
        var courses = new[]
        {
            new CourseVm{Number = "CREA101", Name = "Soins aux créatures magiques", Instructor ="Rubeus Hagrid"},
            new CourseVm{Number = "DARK502", Name = "Défense contre les arts sombres", Instructor ="Severus Snape"},
            new CourseVm{Number = "TRAN201", Name = "Transfiguration", Instructor ="Minerva McGonagall"}
        };
        var camelCaseFormatter = new JsonSerializerSettings();
        camelCaseFormatter.ContractResolver = new CamelCasePropertyNamesContractResolver();
        return JsonConvert.SerializeObject(courses, camelCaseFormatter);
    }

Remarquez l'instance JsonSerializerSettings passée en tant que deuxième paramètre. C'est ce qui rend le camelCase possible.

8voto

Fred Points 378

Dans ASP.NET Core MVC.

    public IActionResult Foo()
    {
        var data = GetData();

        var settings = new JsonSerializerSettings 
        { 
            ContractResolver = new CamelCasePropertyNamesContractResolver() 
        });

        return Json(data, settings);
    }

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