ASP.NET Core 3.0 System.Text.Json Camel Case Serialization

19

Wie geben Sie im ASP.NET Core 3.0-Web-API-Projekt die Serialisierungsoptionen von System.Text.Json an , um die Pascal Case-Eigenschaften automatisch in Camel Case zu serialisieren / deserialisieren und umgekehrt?

Bei einem Modell mit Pascal Case-Eigenschaften wie:

public class Person
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

Und Code zur Verwendung von System.Text.Json zum Deserialisieren einer JSON-Zeichenfolge in den PersonKlassentyp:

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Deserialize<Person>(json);

Deserialisiert nicht erfolgreich, es sei denn, JsonPropertyName wird für jede Eigenschaft wie folgt verwendet:

public class Person
{
    [JsonPropertyName("firstname")
    public string Firstname { get; set; }
    [JsonPropertyName("lastname")
    public string Lastname { get; set; }
}

Ich habe Folgendes versucht startup.cs, aber es hat nicht geholfen, wenn es noch benötigt wird JsonPropertyName:

services.AddMvc().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
});

// also the following given it's a Web API project

services.AddControllers().AddJsonOptions(options => {
    options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        });

Wie können Sie die Serialisierung / Deserialisierung von Camel Case in ASP.NET Core 3.0 mithilfe des neuen System.Text.Json-Namespace festlegen?

Vielen Dank!

Alexander Staroselsky
quelle

Antworten:

25

AddJsonOptions()würde System.Text.Jsonnur für MVC konfigurieren. Wenn Sie JsonSerializerin Ihrem eigenen Code verwenden möchten, sollten Sie die Konfiguration an diesen übergeben.

var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Parse<Person>(json, options);
Kahbazi
quelle
Es gibt keine Möglichkeit, Serialisierungsoptionen für das gesamte Projekt / die gesamte Anwendung mit System.Text.Json anzugeben. Dies war vor System.Text.Json
Alexander Staroselsky
Das glaube ich nicht. Sie müssen die Einstellungen übergeben
Kahbazi
11

In startup.cs:

// keeps the casing to that of the model when serializing to json (default is converting to camelCase)
services.AddMvc()
    .AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null); 

Dies bedeutet, dass Sie newtonsoft.json nicht importieren müssen.

Die einzige andere Option für options.JsonSerializerOptions.PropertyNamingPolicyist JsonNamingPolicy.CamelCase. Es scheint keine anderen JsonNamingPolicyNamensrichtlinienoptionen wie snake_case oder PascalCase zu geben.

Sutherlandahoy
quelle
Das hat bei mir funktioniert. FTR, ich hatte vorher noch keine .AddMvc () in meinen Diensten und fügte sie nur hinzu, damit AddJsonOptions hinzugefügt werden konnten. Alle meine Probleme mit der Server-Client-Serialisierung sind
verschwunden
10

Sie können verwenden PropertyNameCaseInsensitive. Sie müssen es als Parameter an den Deserializer übergeben.

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var options = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true };
var person = JsonSerializer.Deserialize<Person>(json, options);

welche (aus den Dokumenten ):

Ruft einen Wert ab oder legt einen Wert fest, der bestimmt, ob der Name einer Eigenschaft während der Deserialisierung einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung verwendet. Der Standardwert ist false

Daher wird weder camelCase noch PascalCase angegeben, es wird jedoch ein Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung verwendet. Nicht sicher, ob dies Ihren Anforderungen entspricht.


Hinweis: Ich konnte diese Anwendung in einer Konsolen-App nicht breit einstellen. Wie in angemerkt Kahbazi Antwort services.AddMvc().AddJsonOptions und services.AddControllers().AddJsonOptionswird Json für MVC und WebAPI nur Controller konfigurieren (dh nicht konfiguriert werden Json Einstellungen Anwendung breit in einer Konsolenanwendung, zum Beispiel). Im Folgenden wird nur System.Text.Json für Json konfiguriert, das über einen Controller-Endpunkt übergeben wird:

services.AddControllers()
        .AddJsonOptions(options => {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
         }); 
haldo
quelle
6

Wenn Sie eine CamelCase-Serialisierung wünschen, verwenden Sie diesen Code in Startup.cs : (zum Beispiel Vorname)

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        });

Wenn Sie eine PascalCase-Serialisierung wünschen, verwenden Sie diesen Code in Startup.cs : (zum Beispiel Vorname)

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy= null;
        );
Ramil Aliyev
quelle
4

Sie können es weiterhin anwendungsweit festlegen, indem Sie das Microsoft.AspNetCore.Mvc.NewtonsoftJson Nuget-Paket installieren, mit dem Sie die vorherige Json-Serializer-Implementierung verwenden können:

services.AddControllers()
        .AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.ContractResolver = new DefaultContractResolver();
        });

Credits to Poke, Antwort hier gefunden: Wo ist IMvcBuilder AddJsonOptions in .Net Core 3.0 geblieben?

Pierre-Paul St-Pierre
quelle