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:
- Určuje konkrétní serializovanou vlastnost a názvy členů výčtu.
- 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í
Tip
Pomoc s AI můžete použít k přizpůsobení názvů a hodnot vlastností pomocí GitHub Copilotu.
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 WeatherForecastWithPropertyName
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
[JsonPropertyName("Wind")]
public int WindSpeed { get; set; }
}
Public Class WeatherForecastWithPropertyName
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:
- Platí v obou směrech pro serializaci a deserializaci.
- Má přednost před zásadami pojmenování vlastností.
- Nemá vliv na porovnávání názvů parametrů pro parametrizované konstruktory.
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 WeatherForecastWithPropertyName
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
[JsonPropertyName("Wind")]
public int WindSpeed { get; set; }
}
Public Class WeatherForecastWithPropertyName
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ázevWind
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 WeatherForecastWithPropertyName
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
[JsonPropertyName("Wind")]
public int WindSpeed { get; set; }
}
Public Class WeatherForecastWithPropertyName
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 vlastnostiWind
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> .
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 Hot
souhrn , 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)
JsonConverterAttribute
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 JsonStringEnumConverter<TEnum> určit JsonConverterAttribute (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á takto:
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
"Precipitation": "Sleet"
}
Vlastní názvy členů výčtu
Počínaje rozhraním .NET 9 můžete přizpůsobit názvy jednotlivých členů výčtu pro typy, které jsou serializovány jako řetězce. Pokud chcete přizpůsobit název člena výčtu, označte ho atributem JsonStringEnumMemberName.
Předpokládejme například, že potřebujete serializovat následující třídu, která má výčt s vlastním názvem člena:
public class WeatherForecastWithEnumCustomName
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public CloudCover? Sky { get; set; }
}
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum CloudCover
{
Clear,
[JsonStringEnumMemberName("Partly cloudy")]
Partial,
Overcast
}
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á takto:
{
"Date": "2019-08-01T00:00:00-07:00",
"TemperatureCelsius": 25,
"Sky": "Partly cloudy"
}
Generování zdroje
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"
//}
Přizpůsobení názvů a pořadí vlastností pomocí GitHub Copilotu
Pomocí GitHub Copilotu v integrovaném vývojovém prostředí (IDE) můžete vygenerovat kód pro přizpůsobení názvů a pořadí serializovaných vlastností. Můžete přizpůsobit výzvu k výstupu řetězce JSON s názvy vlastností a hodnotami, které vyhovují vašim požadavkům.
Následující příklad ukazuje, jak pomocí Copilotu upravit existující kód pro přizpůsobení názvů vlastností a pořadí při serializaci do FORMÁTU JSON.
Do souboru
Example.cs
kódu v editoru přidejte následující ukázkový kód jazyka C#. V sadě Visual Studio můžete k vyzkoušení tohoto příkladu použít projekt konzolové aplikace jazyka C#.using System.Text.Json; public class Person { public string? FirstName { get; set; } public string? LastName { get; set; } public int Age { get; set; } public string? Country { get; set; } } public class Program { public static void Main() { var person = new Person { FirstName = "John", LastName = "Doe", Age = 30, Country = "USA" }; string jsonString = JsonSerializer.Serialize(person); Console.WriteLine(jsonString); } }
Example.cs
kód provede následující:- Vytvoří instanci
Person
třídy a inicializuje její vlastnosti hodnotami. - Serializuje
person
objekt do řetězce JSON pomocíJsonSerializer.Serialize
. - Vytiskne do konzoly následující řetězec JSON:
{"FirstName":"John","LastName":"Doe","Age":30,"Country":"USA"}
- Vytvoří instanci
V souboru Copilot Chat zadejte následující výzvu k úpravě kódu tak, aby přizpůsobil názvy a pořadí výstupu serializace JSON.
#Example.cs modify code to use System.Text.Json to customize property names and order of JSON output from serialization. Set property names: FirstName to first_name, LastName to last_name. Set order to: Country, FirstName, LastName, Age. Provide customized serialization output.
GitHub Copilot využívá technologii AI, takže jsou možná překvapení a chyby. Další informace najdete v nejčastějších dotazech ke copilotu.
Přečtěte si další informace o GitHub Copilotu v sadě Visual Studio a GitHub Copilotu ve VS Code.