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


19

Nel progetto API Web ASP.NET Core 3.0, come si specificano le opzioni di serializzazione System.Text.Json per serializzare / deserializzare le proprietà di Pascal Case su Camel Case e viceversa automaticamente?

Dato un modello con proprietà Case Pascal come:

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

E codice per utilizzare System.Text.Json per deserializzare una stringa JSON per il tipo di Personclasse:

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

Non deserializza correttamente a meno che JsonPropertyName non venga utilizzato con ogni proprietà come:

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

Ho provato quanto segue startup.cs, ma non ha aiutato in termini di necessità ancora 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;
        });

Come si può impostare la serializzazione / deserializzazione di Camel Case in ASP.NET Core 3.0 usando il nuovo spazio dei nomi System.Text.Json?

Grazie!

Risposte:


25

AddJsonOptions()sarebbe configurato System.Text.Jsonsolo per MVC. Se si desidera utilizzare JsonSerializernel proprio codice, è necessario passare la configurazione ad esso.

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

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

Non è possibile specificare le opzioni di serializzazione per l'intero progetto / applicazione con System.Text.Json? Questo era banale prima di System.Text.Json
Alexander Staroselsky il

Io non la penso così. Devi superare le impostazioni
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); 

Ciò significa che non è necessario importare newtonsoft.json.

L'unica altra opzione per options.JsonSerializerOptions.PropertyNamingPolicyè JsonNamingPolicy.CamelCase. Non sembrano esserci altre JsonNamingPolicyopzioni di criteri di denominazione, come snake_case o PascalCase.


Questo ha funzionato per me. FTR, non avevo .AddMvc () nei miei servizi prima di questo, aggiungendolo solo per poter aggiungere AddJsonOptions. Tutti i miei problemi di serializzazione server-client sono andati via .....
Mark Lazz

10

Puoi usare PropertyNameCaseInsensitive . È necessario passarlo come parametro al deserializzatore.

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

quale (dal documenti ):

Ottiene o imposta un valore che determina se il nome di una proprietà utilizza un confronto senza distinzione tra maiuscole e minuscole durante la deserializzazione. Il valore predefinito è falso

Pertanto, non specifica camelCase o PascalCase ma utilizzerà il confronto senza distinzione tra maiuscole e minuscole. Non sono sicuro che questo soddisfi i tuoi requisiti.


Nota: non sono stato in grado di impostare ampiamente questa applicazione in un'app console. Come indicato nella risposta di Kahbazi services.AddMvc().AddJsonOptions e services.AddControllers().AddJsonOptionsconfigurerà Json solo per i controller MVC e WebApi (ad esempio, non configurerà l'applicazione delle impostazioni Json in un'app console). Di seguito verrà configurato solo System.Text.Json per Json passato attraverso un endpoint del controller:

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

6

Se si desidera la serializzazione di CamelCase, utilizzare questo codice in Startup.cs : (ad esempio firstName)

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

Se si desidera la serializzazione PascalCase utilizzare questo codice in Startup.cs : (ad esempio Nome)

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy= null;
        );

4

Puoi comunque impostare l'applicazione a livello di installazione installando il pacchetto Nuget Microsoft.AspNetCore.Mvc.NewtonsoftJson, che ti consente di utilizzare la precedente implementazione del serializzatore Json:

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

Ringraziamenti a Poke, risposta trovata qui: dove è andato IMvcBuilder AddJsonOptions in .Net Core 3.0?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.