JSON-Eigenschaften jetzt beim Austausch von ASP .Net Core 1.0.0-rc2-final auf 1.0.0 in Kleinbuchstaben

88

Ich habe gerade unser Projekt von ASP .Net Core 1.0.0-rc2-final auf 1.0.0 getauscht. Unsere Website und unser Kunde haben aufgrund der Aktivierung von JSON-Immobilien ihre Arbeit eingestellt. Beispielsweise schlägt diese JavaScript-Zeile jetzt fehl

for (var i = 0; i < collection.Items.length; i++){

weil der Controller jetzt das Array "items" anstelle von "Items" aufruft. Ich habe keine Änderungen vorgenommen, außer die aktualisierten Pakete zu installieren und die Datei project.json zu bearbeiten. Ich habe die C # -Modelldateien nicht geändert, die ihre Eigenschaften noch groß schreiben.

Warum geben die ASP.Net Core-Controller JSON mit Eigenschaften in niedrigeren Fällen zurück? Wie gehe ich zu ihnen zurück, um den Fall der Eigenschaftsnamen aus dem Modell zu berücksichtigen?

Dumbledad
quelle
2
Für diejenigen unter Ihnen, die nach der Antwort für .Net Core 3 suchen, müssen Sie zum Ende der Seite scrollen.
Mike Devenney

Antworten:

154

MVC serialisiert JSON jetzt standardmäßig mit Kamelfallnamen

Verwenden Sie diesen Code, um standardmäßig Kamelfallnamen zu vermeiden

  services.AddMvc()
        .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());

Quelle: https://github.com/aspnet/Announcements/issues/194

Oleksandr Fentsyk
quelle
8
netcore2: Verwenden von Newtonsoft.Json.Serialization;
David.Barkhuizen
3
Ich möchte nicht meine gesamte JSON-Serialisierung ändern, sondern nur einen bestimmten Fall, der dem Verhalten einer Software von Drittanbietern entsprechen muss. Wie stellt man im zweiten Parameter des Json()Aufrufs die richtigen Serialisierungseinstellungen bereit ?
Auspex
70

Falls Sie dies von Google gefunden haben und nach einer Lösung für Core 3 suchen.

Core 3 verwendet System.Text.Json, wodurch der Fall standardmäßig nicht erhalten bleibt. Wie bei diesem GitHub-Problem erwähnt , PropertyNamingPolicywird das Problem durch Setzen von null behoben.

public void ConfigureServices(IServiceCollection services)
{
...
    services.AddControllers()
            .AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);

und wenn Sie die globalen Einstellungen nicht ändern möchten, ist dies nur für eine Aktion wie folgt:

return Json(obj, new JsonSerializerOptions { PropertyNamingPolicy = null });
Ron Rebennack
quelle
6
Du bist mein Herr und Retter
Jonty Morris
1
Dies hat bei Core 3.1 gut funktioniert. Ich konnte meine Kendo-Komponenten nicht richtig zum Laufen bringen und fand, dass der Json im Kamelgehäuse formatiert war. Dies löste das Problem.
Waragi
Ich bin auch dein Thema
João Loureiro
9

Für diejenigen, die auf Core 3.1 migriert sind und über ein Core MVC-Projekt verfügen, kann der folgende Setup-Code in Startup.cs verwendet werden:


        public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddControllersWithViews().AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);
            ...
        }
UY
quelle
Dies entspricht einer vorherigen Antwort stackoverflow.com/a/58187836/125981
Mark Schultheiss
@MarkSchultheiss Sie haben wahrscheinlich Recht, da meine Antwort allen anderen ähnlich ist. Als ich jedoch nach der richtigen Antwort basierend auf meinem Projekttyp gesucht habe, bei dem es sich um MVC mit Ansichten handelt, habe ich keine genaue Antwort gefunden, die zu meinem Projekt passt. AddControllersWithViews () fügt das fehlende Teil hinzu, und ich dachte, es wird in Zukunft für jeden nützlich sein. Vielen Dank für Ihren Kommentar!
UY
3

Dadurch wird das Problem in dotnet core 3 webapi behoben, sodass Ihre Eigenschaftsnamen überhaupt nicht geändert werden und Sie genau das an Ihren Client zurückgeben, was Sie beabsichtigt haben.

In Startup.cs:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
        services.AddHttpClient();
    }
RouterBox
quelle
Dies entspricht einer vorherigen Antwort stackoverflow.com/a/58187836/125981
Mark Schultheiss
1

Für jemanden, der die ASP.net WEB API verwendet (anstelle von ASP.NET Core).

Fügen Sie diese Zeile in Ihre WebApiConfig ein.

//Comment this jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

Fügen Sie dies hier als Antwort hinzu, da dies auch bei der Google-Suche nach Web-API an erster Stelle steht.

Abdul Rehman sagte
quelle
0

Bei Core 2.x-Versionen können Sie mit diesem Code standardmäßig Kamelfallnamen vermeiden. Sie müssen den folgenden Code in die ConfigureServices-Methode der Datei Startup.cs einfügen.

services.AddMvc()
.AddJsonOptions(o =>
{
    if (o.SerializerSettings.ContractResolver != null)
    {
        var castedResolver = o.SerializerSettings.ContractResolver
        as DefaultContractResolver;

        castedResolver.NamingStrategy = null;
    }
});
Asiri Jayaweera
quelle