Přizpůsobení názvů a hodnot vlastností pomocí System.Text.Json

Ve výchozím nastavení se názvy vlastností a klíče slovníku ve výstupu JSON nemění, včetně případu. Hodnoty výčtu jsou reprezentovány jako čísla. Vlastnosti jsou serializovány v pořadí, v jakém jsou definovány. Toto chování ale můžete přizpůsobit takto:

  • Zadejte konkrétní serializované názvy vlastností.
  • Použití předdefinovaných zásad pojmenování, jako jsou camelCase, snake_case nebo kebab-case, pro názvy vlastností a klíče slovníku.
  • Použití vlastních zásad pojmenování pro názvy vlastností a klíče slovníku.
  • Serializace hodnot výčtu jako řetězců s zásadami pojmenování nebo bez.
  • Konfigurace pořadí serializovaných vlastností

Poznámka:

Výchozí zásada pojmenování webu je velká a malá písmena.

V jiných scénářích, které vyžadují speciální zpracování názvů a hodnot vlastností JSON, můžete implementovat vlastní převaděče.

Přizpůsobení názvů jednotlivých vlastností

Pokud chcete nastavit název jednotlivých vlastností, použijte atribut [JsonPropertyName].

Tady je příklad typu serializace a výsledného formátu JSON:

public class WeatherForecastWithPropertyNameAttribute
{
    public DateTimeOffset Date { get; set; }
    public int TemperatureCelsius { get; set; }
    public string? Summary { get; set; }
    [JsonPropertyName("Wind")]
    public int WindSpeed { get; set; }
}
Public Class WeatherForecastWithPropertyNameAttribute
    Public Property [Date] As DateTimeOffset
    Public Property TemperatureCelsius As Integer
    Public Property Summary As String

    <JsonPropertyName("Wind")>
    Public Property WindSpeed As Integer

End Class
{
  "Date": "2019-08-01T00:00:00-07:00",
  "TemperatureCelsius": 25,
  "Summary": "Hot",
  "Wind": 35
}

Název vlastnosti nastavený tímto atributem:

Použití předdefinovaných zásad pojmenování

Následující tabulka ukazuje předdefinované zásady pojmenování a jejich vliv na názvy vlastností.

Zásady pojmenovávání Popis Původní název vlastnosti Převedený název vlastnosti
CamelCase První slovo začíná znakem malého písmena.
Po sobě jdoucí slova začínají velkými písmeny.
TempCelsius tempCelsius
KebabCaseLower* Slova jsou oddělená pomlčkami.
Všechny znaky jsou malými písmeny.
TempCelsius temp-celsius
KebabCaseUpper* Slova jsou oddělená pomlčkami.
Všechny znaky jsou velké.
TempCelsius TEMP-CELSIUS
SnakeCaseLower* Slova jsou oddělená podtržítky.
Všechny znaky jsou malými písmeny.
TempCelsius temp_celsius
SnakeCaseUpper* Slova jsou oddělená podtržítky.
Všechny znaky jsou velké.
TempCelsius TEMP_CELSIUS

* K dispozici v .NET 8 a novějších verzích.

Následující příklad ukazuje, jak použít camel case pro všechny názvy vlastností JSON nastavením JsonSerializerOptions.PropertyNamingPolicy na JsonNamingPolicy.CamelCase:

var serializeOptions = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
    WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, serializeOptions);
Dim serializeOptions As JsonSerializerOptions = New JsonSerializerOptions With {
    .PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
    .WriteIndented = True
}
jsonString = JsonSerializer.Serialize(weatherForecast, serializeOptions)

Tady je příklad třídy pro serializaci a výstup JSON:

public class WeatherForecastWithPropertyNameAttribute
{
    public DateTimeOffset Date { get; set; }
    public int TemperatureCelsius { get; set; }
    public string? Summary { get; set; }
    [JsonPropertyName("Wind")]
    public int WindSpeed { get; set; }
}
Public Class WeatherForecastWithPropertyNameAttribute
    Public Property [Date] As DateTimeOffset
    Public Property TemperatureCelsius As Integer
    Public Property Summary As String

    <JsonPropertyName("Wind")>
    Public Property WindSpeed As Integer

End Class
{
  "date": "2019-08-01T00:00:00-07:00",
  "temperatureCelsius": 25,
  "summary": "Hot",
  "Wind": 35
}

Zásady pojmenování:

  • Platí pro serializaci a deserializaci.
  • Přepíše se atributy [JsonPropertyName] . To je důvod, proč název Wind vlastnosti JSON v příkladu není camel case.

Poznámka:

Žádná z předdefinovaných zásad pojmenování nepodporuje písmena, která jsou náhradními páry. Další informace najdete v tématu dotnet/runtime problém 90352.

Použití vlastních zásad pojmenování vlastností JSON

Pokud chcete použít vlastní zásady pojmenování vlastností JSON, vytvořte třídu odvozenou od JsonNamingPolicy metody a přepište ConvertName ji, jak je znázorněno v následujícím příkladu:

using System.Text.Json;

namespace SystemTextJsonSamples
{
    public class UpperCaseNamingPolicy : JsonNamingPolicy
    {
        public override string ConvertName(string name) =>
            name.ToUpper();
    }
}
Imports System.Text.Json

Namespace SystemTextJsonSamples

    Public Class UpperCaseNamingPolicy
        Inherits JsonNamingPolicy

        Public Overrides Function ConvertName(name As String) As String
            Return name.ToUpper()
        End Function

    End Class

End Namespace

Pak nastavte JsonSerializerOptions.PropertyNamingPolicy vlastnost na instanci vaší třídy zásad pojmenování:

var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = new UpperCaseNamingPolicy(),
    WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, options);
Dim options As JsonSerializerOptions = New JsonSerializerOptions With {
    .PropertyNamingPolicy = New UpperCaseNamingPolicy,
    .WriteIndented = True
}
jsonString = JsonSerializer.Serialize(weatherForecast1, options)

Tady je příklad třídy pro serializaci a výstup JSON:

public class WeatherForecastWithPropertyNameAttribute
{
    public DateTimeOffset Date { get; set; }
    public int TemperatureCelsius { get; set; }
    public string? Summary { get; set; }
    [JsonPropertyName("Wind")]
    public int WindSpeed { get; set; }
}
Public Class WeatherForecastWithPropertyNameAttribute
    Public Property [Date] As DateTimeOffset
    Public Property TemperatureCelsius As Integer
    Public Property Summary As String

    <JsonPropertyName("Wind")>
    Public Property WindSpeed As Integer

End Class
{
  "DATE": "2019-08-01T00:00:00-07:00",
  "TEMPERATURECELSIUS": 25,
  "SUMMARY": "Hot",
  "Wind": 35
}

Zásady pojmenování vlastností JSON:

  • Platí pro serializaci a deserializaci.
  • Přepíše se atributy [JsonPropertyName] . Proto název vlastnosti Wind JSON v příkladu není velkými písmeny.

Použití zásad pojmenování pro klíče slovníku

Pokud je vlastnost objektu, který má být serializován, typ Dictionary<string,TValue>, string lze klíče převést pomocí zásad pojmenování, jako je camel case. Uděláte to tak, že nastavíte JsonSerializerOptions.DictionaryKeyPolicy požadovanou zásadu pojmenování. Následující příklad používá zásadu CamelCase pojmenování:

var options = new JsonSerializerOptions
{
    DictionaryKeyPolicy = JsonNamingPolicy.CamelCase,
    WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, options);
Dim options As JsonSerializerOptions = New JsonSerializerOptions With {
    .DictionaryKeyPolicy = JsonNamingPolicy.CamelCase,
    .WriteIndented = True
}
jsonString = JsonSerializer.Serialize(weatherForecast, options)

Serializace objektu pomocí slovníku s názvem TemperatureRanges , který má páry "ColdMinTemp", 20 klíč-hodnota, a "HotMinTemp", 40 výsledkem by byl výstup JSON podobný následujícímu příkladu:

{
  "Date": "2019-08-01T00:00:00-07:00",
  "TemperatureCelsius": 25,
  "Summary": "Hot",
  "TemperatureRanges": {
    "coldMinTemp": 20,
    "hotMinTemp": 40
  }
}

Zásady pojmenování pro klíče slovníku se vztahují pouze na serializaci. Pokud deserializujete slovník, klíče se shodují se souborem JSON, i když nastavíte JsonSerializerOptions.DictionaryKeyPolicy jiné než výchozí zásady pojmenování.

Výčty jako řetězce

Ve výchozím nastavení jsou výčty serializovány jako čísla. Chcete-li serializovat názvy výčtů jako řetězce, použijte JsonStringEnumConverter nebo JsonStringEnumConverter<TEnum> převaděč. Nativní modul runtime AOT podporuje pouze JsonStringEnumConverter<TEnum> .

Ve výchozím nastavení jsou výčty serializovány jako čísla. Chcete-li serializovat názvy výčtů jako řetězce, použijte JsonStringEnumConverter převaděč.

Předpokládejme například, že potřebujete serializovat následující třídu, která má výčt:

public class WeatherForecastWithEnum
{
    public DateTimeOffset Date { get; set; }
    public int TemperatureCelsius { get; set; }
    public Summary? Summary { get; set; }
}

public enum Summary
{
    Cold, Cool, Warm, Hot
}
Public Class WeatherForecastWithEnum
    Public Property [Date] As DateTimeOffset
    Public Property TemperatureCelsius As Integer
    Public Property Summary As Summary
End Class

Public Enum Summary
    Cold
    Cool
    Warm
    Hot
End Enum

Pokud je Hotsouhrn , serializovaný JSON má ve výchozím nastavení číselnou hodnotu 3:

{
  "Date": "2019-08-01T00:00:00-07:00",
  "TemperatureCelsius": 25,
  "Summary": 3
}

Následující vzorový kód serializuje názvy výčtů místo číselných hodnot a převede názvy na camel case:

options = new JsonSerializerOptions
{
    WriteIndented = true,
    Converters =
    {
        new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)
    }
};
jsonString = JsonSerializer.Serialize(weatherForecast, options);
options = New JsonSerializerOptions With {
    .WriteIndented = True
}
options.Converters.Add(New JsonStringEnumConverter(JsonNamingPolicy.CamelCase))
jsonString = JsonSerializer.Serialize(weatherForecast, options)

Výsledný json vypadá jako v následujícím příkladu:

{
  "Date": "2019-08-01T00:00:00-07:00",
  "TemperatureCelsius": 25,
  "Summary": "hot"
}

Předdefinované JsonStringEnumConverter můžou deserializovat i řetězcové hodnoty. Funguje s zadanou zásadou pojmenování nebo bez ní. Následující příklad ukazuje deserializaci pomocí CamelCase:

options = new JsonSerializerOptions
{
    Converters =
    {
        new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)
    }
};
weatherForecast = JsonSerializer.Deserialize<WeatherForecastWithEnum>(jsonString, options)!;
options = New JsonSerializerOptions
options.Converters.Add(New JsonStringEnumConverter(JsonNamingPolicy.CamelCase))
weatherForecast = JsonSerializer.Deserialize(Of WeatherForecastWithEnum)(jsonString, options)

Můžete také určit převaděč, který se má použít, anotací výčtu pomocí JsonConverterAttribute. Následující příklad ukazuje, jak pomocí atributu JsonConverterAttribute určit JsonStringEnumConverter<TEnum> (dostupné v .NET 8 a novějších verzích). Předpokládejme například, že potřebujete serializovat následující třídu, která má výčt:

public class WeatherForecastWithPrecipEnum
{
    public DateTimeOffset Date { get; set; }
    public int TemperatureCelsius { get; set; }
    public Precipitation? Precipitation { get; set; }
}

[JsonConverter(typeof(JsonStringEnumConverter<Precipitation>))]
public enum Precipitation
{
    Drizzle, Rain, Sleet, Hail, Snow
}

Následující vzorový kód serializuje názvy výčtů místo číselných hodnot:

var options = new JsonSerializerOptions
{
    WriteIndented = true,
};
jsonString = JsonSerializer.Serialize(weatherForecast, options);

Výsledný json vypadá jako v následujícím příkladu:

{
  "Date": "2019-08-01T00:00:00-07:00",
  "TemperatureCelsius": 25,
  "Precipitation": "Sleet"
}

Chcete-li použít převaděč s generováním zdroje, viz serializace výčtových polí jako řetězce.

Konfigurace pořadí serializovaných vlastností

Ve výchozím nastavení jsou vlastnosti serializovány v pořadí, ve kterém jsou definovány ve své třídě. Atribut [JsonPropertyOrder] umožňuje zadat pořadí vlastností ve výstupu JSON ze serializace. Výchozí hodnota Order vlastnosti je nula. Nastavte Order na kladné číslo, aby se vlastnost umístila za vlastnostmi, které mají výchozí hodnotu. Záporná Order pozice vlastnosti před vlastnostmi, které mají výchozí hodnotu. Vlastnosti se zapisují v pořadí od nejnižší Order hodnoty po nejvyšší. Tady je příklad:

using System.Text.Json;
using System.Text.Json.Serialization;

namespace PropertyOrder
{
    public class WeatherForecast
    {
        [JsonPropertyOrder(-5)]
        public DateTime Date { get; set; }
        public int TemperatureC { get; set; }
        [JsonPropertyOrder(-2)]
        public int TemperatureF { get; set; }
        [JsonPropertyOrder(5)]
        public string? Summary { get; set; }
        [JsonPropertyOrder(2)]
        public int WindSpeed { get; set; }
    }

    public class Program
    {
        public static void Main()
        {
            var weatherForecast = new WeatherForecast
            {
                Date = DateTime.Parse("2019-08-01"),
                TemperatureC = 25,
                TemperatureF = 25,
                Summary = "Hot",
                WindSpeed = 10
            };

            var options = new JsonSerializerOptions { WriteIndented = true };
            string jsonString = JsonSerializer.Serialize(weatherForecast, options);
            Console.WriteLine(jsonString);
        }
    }
}
// output:
//{
//  "Date": "2019-08-01T00:00:00",
//  "TemperatureF": 25,
//  "TemperatureC": 25,
//  "WindSpeed": 10,
//  "Summary": "Hot"
//}

Viz také