Come impostare globalmente le opzioni predefinite per System.Text.Json.JsonSerializer?


12

AGGIORNAMENTO [23-12-2019]: in parte a causa dell'input della comunità vocale , questo problema è stato aggiunto alla tabella di marcia per .NET 5.0.

AGGIORNAMENTO [10-10-2019]: se interessati a vedere implementato questo comportamentoSystem.Text.Json.JsonSerializervai oltre al problema di GitHub aperto sottolineato da Chris Yungmann e pesa.


Invece di questo:

JsonSerializerOptions options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};
JsonSerializer.Deserialize<SomeObject>(someJsonString, options);

Vorrei fare qualcosa del genere:

// This property is a pleasant fiction
JsonSerializer.DefaultSettings = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};

// This uses my options
JsonSerializer.Deserialize<SomeObject>(someJsonString); 

// And somewhere else in the same codebase...
// This also uses my options
JsonSerializer.Deserialize<SomeOtherObject>(someOtherJsonString); 

La speranza è di non dover passare un'istanza JsonSerializerOptionsper i nostri casi più comuni e di sostituire l'eccezione, non la regola.

Come indicato in queste domande e risposte, questa è una funzione utile di Json.Net. Ho guardato nella documentazione per System.Text.Jsoncosì come questo repo GitHub for .NET Nucleo. E questo uno .

Non sembra esserci un analogo per la gestione delle impostazioni predefinite di serializzazione JSON in .NET Core 3. O lo sto trascurando?


There doesn't seem to be an analog for managing JSON serialization defaults in Core-3- stai parlando di richieste in entrata e in uscita dalla tua API? o richieste e risposte ad altre risorse?
ps2goat,

@ ps2goat Non sono sicuro di aver capito la tua domanda. La questione qui è (de) serializzare le stringhe JSON. Potrebbero provenire da qualsiasi numero di fonti.
Trevor Reid,

Lo stavo chiedendo perché ci sono posti speciali durante l'avvio per i formattatori di input e output (ad esempio, per il binding del modello)
ps2goat,

Ah, capito. In tal senso, penso che il nostro caso rientrerebbe in "altre risorse". @ ps2goat
Trevor Reid,

È davvero triste, fino al .net core 3.1, non esisteva ancora un buon serializzatore json incorporato.
Joke Huang

Risposte:


4

No, JsonSerializerOptionsnon espone le opzioni predefinite . Se si utilizza un determinato framework Web, è possibile che sia possibile specificare le impostazioni di (de) serializzazione. Altrimenti, suggerisco di creare i propri metodi di praticità.

Vedi anche questo numero aperto .


3

È possibile creare un metodo di estensione. Ecco un esempio

Uso metodi separati rispetto a dover creare impostazioni speciali, in modo che tutte le impostazioni siano in un unico punto e facilmente riutilizzabili.

public static class DeserializeExtensions
{
    private static JsonSerializerOptions defaultSerializerSettings = new JsonSerializerOptions();

    // set this up how you need to!
    private static JsonSerializerOptions featureXSerializerSettings = new JsonSerializerOptions();


    public static T Deserialize<T>(this string json)
    {       
        return JsonSerializer.Deserialize<T>(json, defaultSerializerSettings);
    }

    public static T DeserializeCustom<T>(this string json, JsonSerializerOptions settings)
    {
        return JsonSerializer.Deserialize<T>(json, settings);
    }

    public static T DeserializeFeatureX<T>(this string json)
    {
        return JsonSerializer.Deserialize<T>(json, featureXSerializerSettings);
    }
}

Quindi lo chiami come metodo su una stringa, sia letterale che variabile.

    Car result = @"{""Wheels"": 4, ""Doors"": 2}".DeserializeFeatureX<Car>();

Ah, la tua è un'altra risposta dipendente da Json.Net, credo. Questa domanda riguarda System.Text.Json.JsonSerializerNET Core-3.0 senza dipendenze aggiuntive. Grazie.
Trevor Reid,

2
Questa è la bellezza dell'astrazione. Nessun codice cambia al di fuori di questa classe di estensione! Ho appena aggiornato l'integrato System.Text.Json.JsonSerializer. Il concetto era esattamente lo stesso. Ho anche aggiornato il link di esempio.
ps2goat,


2

Una soluzione alternativa è stata proposta dall'utente andre-ss6 di GitHub come segue:

((JsonSerializerOptions)typeof(JsonSerializerOptions)
    .GetField("s_defaultOptions", 
        System.Reflection.BindingFlags.Static |
        System.Reflection.BindingFlags.NonPublic).GetValue(null))
    .PropertyNameCaseInsensitive = true;

-1

(Se mai passassi a usare Json.NET)

Preferisco e consiglio di essere esplicito e passare le impostazioni a tutte le chiamate, ma è possibile impostare i valori predefiniti con DefaultSettings .

JsonConvert.DefaultSettings = () => MySuperJsonSerializerSettings;

e poi

var json = JsonConvert.SerializeObject(o1);
var o2 = JsonConvert.DeserializeObject(x);

Questa risposta e collegamento di @tymtam si applica a Json.Net. Questa domanda riguarda il comportamento simialr in System.Text.Jsoncui la serializzazione JSON è inserita in .NET Core 3.0. Grazie per il tempo dedicato a rispondere.
Trevor Reid,
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.