.NET'te JSON'u seri hale getirme ve seriden serileştirme (sıralama ve serileştirmeyi geri getirme)
Bu makalede, ad alanını kullanarak seri hale getirme ve seri System.Text.Json durumdan (JSON) JavaScript Nesne Gösterimi gösterir. Mevcut kodu 'dan taşımaya devam ediyorsanız Newtonsoft.Json bkz. 'a geçirme. System.Text.Json
Kod örnekleri
Bu makaledeki kod örnekleri:
Kitaplığı doğrudan, örneğin bir çerçeve aracılığıyla değil,doğrudan ASP.NET Core.
sınıfından JsonSerializer serileştirmek ve seri halinden serileştirmek için özel türler ile sınıfını kullanın.
kullanarak JSON verilerini okuma ve yazma hakkında bilgi için
JsonSerializerbkz. JSON DOM, Utf8JsonReader ve Utf8JsonWriter kullanma.Yararlı WriteIndented olduğunda JSON'u okunabilirlik için biçimlendirme seçeneğini kullanın.
Gereksiz boşluk eklemenin performans ve bant genişliği kullanımı üzerinde olumsuz bir etkisi olabilir, çünkü üretim kullanımı için genellikle varsayılan değerini kabul
falseedersiniz.Aşağıdaki sınıfına ve çeşitlemelere bakın:
public class WeatherForecast { public DateTimeOffset Date { get; set; } public int TemperatureCelsius { get; set; } public string Summary { get; set; } }Public Class WeatherForecast Public Property [Date] As DateTimeOffset Public Property TemperatureCelsius As Integer Public Property Summary As String End Class
Visual Basic desteği
Başvuru System.Text.Json yapılarının kullanım bölümleri,bu yapı tarafından Visual Basic. Uygulamayla başvuru yapı System.Text.Json API'lerini kullanmayı dener Visual Basic BC40000 derleyici hataları alısabilirsiniz. Hata iletisi, sorunun eski bir API olduğunu gösterir, ancak asıl sorun derleyicide başvuru yapı desteği olmamasıdır. Aşağıdaki bölümleri System.Text.Json aşağıdaki bölümlerden Visual Basic:
- Utf8JsonReadersınıfı. yöntemi JsonConverter<T>.Read bir parametre
Utf8JsonReaderalır, bu sınırlama özel dönüştürücüler yazmak için Visual Basic kullanabileceğiniz anlamına gelir. Bunun geçici çözümü, bir C# kitaplık derlemesinde özel dönüştürücüler uygulamak ve VB projenize bu derlemeye başvuru yapmaktır. Bu, tüm bu Visual Basic dönüştürücüleri seri hale getiriciye kaydetmek olduğunu varsayıyor. Dönüştürücülerin yöntemleriniReadkoddan çağıra Visual Basic. - Tür içeren diğer API'ler için aşırı ReadOnlySpan<T> yüklemeler. Yöntemlerin çoğu yerine kullanan aşırı
StringyüklemeleriReadOnlySpaniçerir.
Başvuru yapılarının yalnızca "üzerinden veri geçirme" olsa bile dil desteği olmadan güvenli bir şekilde kullanılamaması bu kısıtlamalara neden olur. Bu hatanın tersine çevirerek Visual Basic bozan ve yapılmamış olması gereken bir kodla sonuçlanabilirsiniz.
Ad alanları
Ad System.Text.Json alanı tüm giriş noktalarını ve ana türleri içerir. Ad System.Text.Json.Serialization alanı, gelişmiş senaryolar için öznitelikler ve API'ler ve serileştirme ve seri durumdan kaldırıcıya özgü özelleştirme içerir. Bu makalede gösterilen kod örnekleri, şu using ad alanlarından biri veya her ikisi için yönergeler gerektirir:
using System.Text.Json;
using System.Text.Json.Serialization;
Imports System.Text.Json
Imports System.Text.Json.Serialization
Önemli
ad alanının System.Runtime.Serialization öznitelikleri içinde System.Text.Json desteklenmiyor.
.NET nesnelerini JSON olarak yazma (seri hale getirme)
JSON'u bir dizeye veya dosyaya yazmak için yöntemini JsonSerializer.Serialize çağırabilirsiniz.
Aşağıdaki örnek bir dize olarak JSON oluşturur:
using System;
using System.Text.Json;
namespace SerializeBasic
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
}
public class Program
{
public static void Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot"
};
string jsonString = JsonSerializer.Serialize(weatherForecast);
Console.WriteLine(jsonString);
}
}
}
// output:
//{"Date":"2019-08-01T00:00:00-07:00","TemperatureCelsius":25,"Summary":"Hot"}
Dim jsonString As String
JSON çıkışı varsayılan olarak azaltılır (boşluk, girintileme ve yeni satır karakterleri kaldırılır).
Aşağıdaki örnek, JSON dosyası oluşturmak için zaman uyumlu kodu kullanır:
using System;
using System.IO;
using System.Text.Json;
namespace SerializeToFile
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
}
public class Program
{
public static void Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot"
};
string fileName = "WeatherForecast.json";
string jsonString = JsonSerializer.Serialize(weatherForecast);
File.WriteAllText(fileName, jsonString);
Console.WriteLine(File.ReadAllText(fileName));
}
}
}
// output:
//{"Date":"2019-08-01T00:00:00-07:00","TemperatureCelsius":25,"Summary":"Hot"}
jsonString = JsonSerializer.Serialize(weatherForecast1)
File.WriteAllText(fileName, jsonString)
Aşağıdaki örnek, JSON dosyası oluşturmak için zaman uyumsuz kod kullanır:
using System;
using System.IO;
using System.Text.Json;
using System.Threading.Tasks;
namespace SerializeToFileAsync
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
}
public class Program
{
public static async Task Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot"
};
string fileName = "WeatherForecast.json";
using FileStream createStream = File.Create(fileName);
await JsonSerializer.SerializeAsync(createStream, weatherForecast);
await createStream.DisposeAsync();
Console.WriteLine(File.ReadAllText(fileName));
}
}
}
// output:
//{"Date":"2019-08-01T00:00:00-07:00","TemperatureCelsius":25,"Summary":"Hot"}
Dim createStream As FileStream = File.Create(fileName)
Await JsonSerializer.SerializeAsync(createStream, weatherForecast1)
Yukarıdaki örneklerde, seri hale getirilecek tür için tür çıkarlığı 2. aşırı yüklemesi Serialize() genel tür parametresini alır:
using System;
using System.Text.Json;
namespace SerializeWithGenericParameter
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
}
public class Program
{
public static void Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot"
};
string jsonString = JsonSerializer.Serialize<WeatherForecast>(weatherForecast);
Console.WriteLine(jsonString);
}
}
}
// output:
//{"Date":"2019-08-01T00:00:00-07:00","TemperatureCelsius":25,"Summary":"Hot"}
jsonString = JsonSerializer.Serialize(Of WeatherForecastWithPOCOs)(weatherForecast)
Serileştirme örneği
Burada koleksiyon özellikleri ve kullanıcı tanımlı tür içeren bir sınıfın nasıl seri hale getir getirll olduğunu gösteren bir örnek ve bir örnek ve bulunmaktadır:
using System;
using System.Collections.Generic;
using System.Text.Json;
namespace SerializeExtra
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
public string SummaryField;
public IList<DateTimeOffset> DatesAvailable { get; set; }
public Dictionary<string, HighLowTemps> TemperatureRanges { get; set; }
public string[] SummaryWords { get; set; }
}
public class HighLowTemps
{
public int High { get; set; }
public int Low { get; set; }
}
public class Program
{
public static void Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot",
SummaryField = "Hot",
DatesAvailable = new List<DateTimeOffset>()
{ DateTime.Parse("2019-08-01"), DateTime.Parse("2019-08-02") },
TemperatureRanges = new Dictionary<string, HighLowTemps>
{
["Cold"] = new HighLowTemps { High = 20, Low = -10 },
["Hot"] = new HighLowTemps { High = 60 , Low = 20 }
},
SummaryWords = new[] { "Cool", "Windy", "Humid" }
};
var options = new JsonSerializerOptions { WriteIndented = true };
string jsonString = JsonSerializer.Serialize(weatherForecast, options);
Console.WriteLine(jsonString);
}
}
}
// output:
//{
// "Date": "2019-08-01T00:00:00-07:00",
// "TemperatureCelsius": 25,
// "Summary": "Hot",
// "DatesAvailable": [
// "2019-08-01T00:00:00-07:00",
// "2019-08-02T00:00:00-07:00"
// ],
// "TemperatureRanges": {
// "Cold": {
// "High": 20,
// "Low": -10
// },
// "Hot": {
// "High": 60,
// "Low": 20
// }
// },
// "SummaryWords": [
// "Cool",
// "Windy",
// "Humid"
// ]
//}
Public Class WeatherForecastWithPOCOs
Public Property [Date] As DateTimeOffset
Public Property TemperatureCelsius As Integer
Public Property Summary As String
Public SummaryField As String
Public Property DatesAvailable As IList(Of DateTimeOffset)
Public Property TemperatureRanges As Dictionary(Of String, HighLowTemps)
Public Property SummaryWords As String()
End Class
Public Class HighLowTemps
Public Property High As Integer
Public Property Low As Integer
End Class
' serialization output formatted (pretty-printed with whitespace and indentation):
' {
' "Date": "2019-08-01T00:00:00-07:00",
' "TemperatureCelsius": 25,
' "Summary": "Hot",
' "DatesAvailable": [
' "2019-08-01T00:00:00-07:00",
' "2019-08-02T00:00:00-07:00"
' ],
' "TemperatureRanges": {
' "Cold": {
' "High": 20,
' "Low": -10
' },
' "Hot": {
' "High": 60,
' "Low": 20
' }
' },
' "SummaryWords": [
' "Cool",
' "Windy",
' "Humid"
' ]
' }
UTF-8'e seri hale getirme
Bir UTF-8 byte dizisine seri hale getirme, dize tabanlı yöntemleri kullanmaya göre yaklaşık %5-10 daha hızlıdır. Fark, baytların (UTF-8 gibi) dizelere dönüştürülmesi gerekmesidir (UTF-16).
Bir UTF-8 byte dizisine serileştirmek için yöntemini JsonSerializer.SerializeToUtf8Bytes çağırın:
byte[] jsonUtf8Bytes =JsonSerializer.SerializeToUtf8Bytes(weatherForecast);
Dim jsonUtf8Bytes As Byte()
Dim options As JsonSerializerOptions = New JsonSerializerOptions With {
.WriteIndented = True
}
jsonUtf8Bytes = JsonSerializer.SerializeToUtf8Bytes(weatherForecast1, options)
alan Serialize bir aşırı yükleme de Utf8JsonWriter kullanılabilir.
Serileştirme davranışı
- Varsayılan olarak, tüm genel özellikler serileştirilmiştir. Yoksaymak için özellikler belirtebilirsiniz.
- Varsayılan kodlayıcı ASCII olmayan karakterleri, ASCII aralığındaki HTML'ye duyarlı karakterleri ve RFC 8259 JSONözel durumuna göre kaçış karakteri olarak kaçış karakteri olarak kullanır.
- Varsayılan olarak, JSON değeri en azdır. JSON'u oldukça yazdırabilirsiniz.
- Varsayılan olarak, JSON adlarının büyük/son değerleri .NET adları ile eş değerdir. JSON ad büyük/büyük/yeni adını özelleştirebilirsiniz.
- Varsayılan olarak, döngüsel başvurular algılanır ve özel durumlar oluşturur. Başvuruları koruyarak döngüsel başvuruları işleysiniz.
- Varsayılan olarak, alanlar yoksayılır. alanlarını dahilebilirsiniz.
Bir System.Text.Json uygulamanın içinde dolaylı ASP.NET Core, bazı varsayılan davranışlar farklıdır. Daha fazla bilgi için bkz. JsonSerializerOptions için web varsayılanları.
- Varsayılan olarak, tüm genel özellikler serileştirilmiştir. Yoksaymak için özellikler belirtebilirsiniz.
- Varsayılan kodlayıcı ASCII olmayan karakterleri, ASCII aralığındaki HTML'ye duyarlı karakterleri ve RFC 8259 JSONözel durumuna göre kaçış karakteri olarak kaçış karakteri olarak kullanır.
- Varsayılan olarak, JSON değeri en azdır. JSON'u oldukça yazdırabilirsiniz.
- Varsayılan olarak, JSON adlarının büyük/son değerleri .NET adları ile eş değerdir. JSON ad büyük/büyük/yeni adını özelleştirebilirsiniz.
- Döngüsel başvurular algılanır ve özel durumlar oluşturur.
- Alanlar yoksayılır.
Desteklenen türler şunlardır:
- Sayısal türler, dizeler ve Boole gibi JavaScript ilkelleri ile eşilen .NET temelleri.
- Kullanıcı tanımlı düz eski CLR nesneleri (POCOs).
- Tek boyutlu ve etiketli diziler (
T[][]). - Aşağıdaki ad alanlarından koleksiyonlar ve sözlükler.
- Sayısal türler, dizeler ve Boole gibi JavaScript ilkelleri ile eşilen .NET temelleri.
- Kullanıcı tanımlı düz eski CLR nesneleri (POCOs).
- Tek boyutlu ve etiketli diziler (
ArrayName[][]). Dictionary<string,TValue>buradaTValue,objectveyaJsonElementPOCO'larıdır.- Aşağıdaki ad alanlarından koleksiyonlar.
Daha fazla bilgi için bkz. System.Text.Json içinde desteklenen koleksiyon türleri.
Ek türleri işlemek veya yerleşik dönüştürücüler tarafından desteklenen işlevler sağlamak için özel dönüştürücüler kullanabilirsiniz.
JSON'u .NET nesneleri olarak okuma (rialize)
JSON'u serisini geri alamanın yaygın bir yolu, önce JSON özelliklerinin bir veya daha fazlasını temsil eden özelliklere ve alanlara sahip bir sınıf oluşturmaktır. Ardından, bir dizeden veya dosyadan dizisini desrialize etmek için yöntemini JsonSerializer.Deserialize çağırabilirsiniz. Genel aşırı yüklemeler için, oluşturduğunuz sınıfın türünü genel tür parametresi olarak iletirsiniz. Genel olmayan aşırı yüklemeler için, oluşturduğunuz sınıfın türünü yöntem parametresi olarak iletirsiniz. Zaman uyumlu veya zaman uyumsuz olarak deserialize. Sınıfınıza temsil edilmeen tüm JSON özellikleri yoksayılır.
Aşağıdaki örnekte, bir JSON dizesinin nasıl dizilimli olduğu gösterir:
using System;
using System.Collections.Generic;
using System.Text.Json;
namespace DeserializeExtra
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
public string SummaryField;
public IList<DateTimeOffset> DatesAvailable { get; set; }
public Dictionary<string, HighLowTemps> TemperatureRanges { get; set; }
public string[] SummaryWords { get; set; }
}
public class HighLowTemps
{
public int High { get; set; }
public int Low { get; set; }
}
public class Program
{
public static void Main()
{
string jsonString =
@"{
""Date"": ""2019-08-01T00:00:00-07:00"",
""TemperatureCelsius"": 25,
""Summary"": ""Hot"",
""DatesAvailable"": [
""2019-08-01T00:00:00-07:00"",
""2019-08-02T00:00:00-07:00""
],
""TemperatureRanges"": {
""Cold"": {
""High"": 20,
""Low"": -10
},
""Hot"": {
""High"": 60,
""Low"": 20
}
},
""SummaryWords"": [
""Cool"",
""Windy"",
""Humid""
]
}
";
WeatherForecast weatherForecast =
JsonSerializer.Deserialize<WeatherForecast>(jsonString);
Console.WriteLine($"Date: {weatherForecast.Date}");
Console.WriteLine($"TemperatureCelsius: {weatherForecast.TemperatureCelsius}");
Console.WriteLine($"Summary: {weatherForecast.Summary}");
}
}
}
// output:
//Date: 8/1/2019 12:00:00 AM -07:00
//TemperatureCelsius: 25
//Summary: Hot
weatherForecast = JsonSerializer.Deserialize(Of WeatherForecastWithPOCOs)(jsonString)
Zaman uyumlu kod kullanarak bir dosyadan dizisini dekronize etmek için, aşağıdaki örnekte gösterildiği gibi dosyayı bir dizede okuyun:
using System;
using System.IO;
using System.Text.Json;
namespace DeserializeFromFile
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
}
public class Program
{
public static void Main()
{
string fileName = "WeatherForecast.json";
string jsonString = File.ReadAllText(fileName);
WeatherForecast weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(jsonString);
Console.WriteLine($"Date: {weatherForecast.Date}");
Console.WriteLine($"TemperatureCelsius: {weatherForecast.TemperatureCelsius}");
Console.WriteLine($"Summary: {weatherForecast.Summary}");
}
}
}
// output:
//Date: 8/1/2019 12:00:00 AM -07:00
//TemperatureCelsius: 25
//Summary: Hot
jsonString = File.ReadAllText(fileName)
weatherForecast1 = JsonSerializer.Deserialize(Of WeatherForecast)(jsonString)
Zaman uyumsuz kod kullanarak bir dosyadanrialize etmek için yöntemini DeserializeAsync çağrısı:
using System;
using System.IO;
using System.Text.Json;
using System.Threading.Tasks;
namespace DeserializeFromFileAsync
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
}
public class Program
{
public static async Task Main()
{
string fileName = "WeatherForecast.json";
using FileStream openStream = File.OpenRead(fileName);
WeatherForecast weatherForecast =
await JsonSerializer.DeserializeAsync<WeatherForecast>(openStream);
Console.WriteLine($"Date: {weatherForecast.Date}");
Console.WriteLine($"TemperatureCelsius: {weatherForecast.TemperatureCelsius}");
Console.WriteLine($"Summary: {weatherForecast.Summary}");
}
}
}
// output:
//Date: 8/1/2019 12:00:00 AM -07:00
//TemperatureCelsius: 25
//Summary: Hot
Dim openStream As FileStream = File.OpenRead(fileName)
weatherForecast1 = Await JsonSerializer.DeserializeAsync(Of WeatherForecast)(openStream)
İpucu
Serisini kaldırmak istediğiniz JSON'niz varsa ve bunu içine serisinden kaldırmak için sınıfınız yoksa, ihtiyacınız olan sınıfı el ile oluşturmak dışında seçenekleriniz vardır:
Bir JSON DOM'da (belge nesne modeli) birrialize çıkarma ve DOM'dan ihtiyacınız olan şeyi ayıklama.
DOM, bir JSON yükünün altbzesinde gezinmenizi ve tek bir değeri, özel türü veya diziyi diziden alamanızı sağlar. .NET 6'daki DOM hakkında bilgi için bkz. JSON yükünün alt JsonNode bölümlerini deserialize. DOM hakkında bilgi JsonDocument için bkz. JsonDocument ve JsonElement'de alt öğeleri arama.
Utf8JsonReader'ı doğrudan kullanın.
Gereken Visual Studio otomatik olarak oluşturmak için 2019'da şu şekilde kullanın:
- Deserialize için gereken JSON'u kopyalayın.
- Bir sınıf dosyası oluşturun ve şablon kodunu silin.
- Özel Yapıştır JSON > Yapıştır'ı > Sınıflar olarak Düzenle'yi seçin. Sonuç, serisini kaldıran hedefiniz için kullanabileceğiniz bir sınıftır.
UTF-8'den deserialize
UTF-8'denrialize etmek için, aşağıdaki örneklerde gösterildiği gibi bir veya alan JsonSerializer.Deserialize bir aşırı yükleme çağrısı ReadOnlySpan<byte> Utf8JsonReader yapın. Örnekler, JSON'un jsonUtf8Bytes adlı bir bayt dizisinde olduğunu varsayıyor.
var readOnlySpan = new ReadOnlySpan<byte>(jsonUtf8Bytes);
WeatherForecast deserializedWeatherForecast =
JsonSerializer.Deserialize<WeatherForecast>(readOnlySpan);
Dim jsonString = Encoding.UTF8.GetString(jsonUtf8Bytes)
weatherForecast1 = JsonSerializer.Deserialize(Of WeatherForecast)(jsonString)
var utf8Reader = new Utf8JsonReader(jsonUtf8Bytes);
WeatherForecast deserializedWeatherForecast =
JsonSerializer.Deserialize<WeatherForecast>(ref utf8Reader);
' This code example doesn't apply to Visual Basic. For more information, go to the following URL:
' https://docs.microsoft.com/dotnet/standard/serialization/system-text-json-how-to#visual-basic-support
Deserialization behavior
JSON'unrializing için aşağıdaki davranışlar geçerlidir:
- Varsayılan olarak, özellik adı eşleştirme büyük/büyük/büyük harfe duyarlıdır. Büyük/büyük/büyük harfe duyarsızlığı belirtesiniz.
- JSON salt okunur özellik için bir değer içeriyorsa, değer yoksayılır ve hiçbir özel durum olmaz.
- Ortak olmayan oluşturucular seri hale getirici tarafından yoksayılır.
- Sabit nesneler veya ortak erişimcileri olan özellikler için
setdeserialization desteklenmedir. Bkz. Sabit türler ve Kayıtlar. - Varsayılan olarak, enum'lar sayı olarak değerdir. Enum adlarını dize olarak seri hale getirsiniz.
- Varsayılan olarak, alanlar yoksayılır. alanlarını dahilebilirsiniz.
- Varsayılan olarak, JSON'daki açıklamalar veya sonda virgüller özel durumlar oluşturur. Açıklamalara ve sonda virgüllere izin veebilirsiniz.
- Varsayılan en fazla derinlik 64'tir.
Bir System.Text.Json uygulamanın içinde dolaylı ASP.NET Core, bazı varsayılan davranışlar farklıdır. Daha fazla bilgi için bkz. JsonSerializerOptions için web varsayılanları.
- Varsayılan olarak, özellik adı eşleştirme büyük/büyük/büyük harfe duyarlıdır. Büyük/büyük/büyük harfe duyarsızlığı belirtesiniz. ASP.NET Core uygulamalar varsayılan olarak büyük/büyük/harfe duyarsızlığı belirtir.
- JSON salt okunur özellik için bir değer içeriyorsa, değer yoksayılır ve hiçbir özel durum olmaz.
- Genel, iç veya özel olabilir parametresiz bir oluşturucu, deserialization için kullanılır.
- Sabit nesneler veya ortak erişimcileri olmayan özellikler için
setdeserialization desteklenmiyor. - Varsayılan olarak, enum'lar sayı olarak değerdir. Enum adlarını dize olarak seri hale getirsiniz.
- Alanlar desteklenmiyor.
- Varsayılan olarak, JSON'daki açıklamalar veya sonda virgüller özel durumlar oluşturur. Açıklamalara ve sonda virgüllere izin veebilirsiniz.
- Varsayılan en fazla derinlik 64'tir.
Bir System.Text.Json uygulamanın içinde dolaylı ASP.NET Core, bazı varsayılan davranışlar farklıdır. Daha fazla bilgi için bkz. JsonSerializerOptions için web varsayılanları.
Yerleşik dönüştürücüler tarafından desteklenen işlevler sağlamak için özel dönüştürücüler kullanabilirsiniz.
Biçimlendirilmiş JSON'a seri hale getirme
JSON çıktısını güzel yazdırmak için olarak JsonSerializerOptions.WriteIndented true ayarlayın:
using System;
using System.Text.Json;
namespace SerializeWriteIndented
{
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
}
public class Program
{
public static void Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
Summary = "Hot"
};
var options = new JsonSerializerOptions { WriteIndented = true };
string jsonString = JsonSerializer.Serialize(weatherForecast, options);
Console.WriteLine(jsonString);
}
}
}
// output:
//{
// "Date": "2019-08-01T00:00:00-07:00",
// "TemperatureCelsius": 25,
// "Summary": "Hot"
//}
Dim options As JsonSerializerOptions = New JsonSerializerOptions With {
.WriteIndented = True
}
jsonString = JsonSerializer.Serialize(weatherForecast, options)
Aynı JsonSerializerOptions seçeneklerle tekrar tekrar kullanıyorsanız, her kullansanız JsonSerializerOptions yeni bir örnek oluşturmaz. Her çağrı için aynı örneği yeniden kullanma. Daha fazla bilgi için bkz. JsonSerializerOptions örneklerini yeniden kullanma.
Alanları dahil etmek
Aşağıdaki örnekte gösterildiği gibi genel ayarı veya JsonSerializerOptions.IncludeFields [JsonInclude] özniteliğini kullanarak seri hale getirme veya seriden seriden serileştirmeyi geri aken alanları dahil etmek için:
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Fields
{
public class Forecast
{
public DateTime Date;
public int TemperatureC;
public string Summary;
}
public class Forecast2
{
[JsonInclude]
public DateTime Date;
[JsonInclude]
public int TemperatureC;
[JsonInclude]
public string Summary;
}
public class Program
{
public static void Main()
{
var json =
@"{""Date"":""2020-09-06T11:31:01.923395"",""TemperatureC"":-1,""Summary"":""Cold""} ";
Console.WriteLine($"Input JSON: {json}");
var options = new JsonSerializerOptions
{
IncludeFields = true,
};
var forecast = JsonSerializer.Deserialize<Forecast>(json, options);
Console.WriteLine($"forecast.Date: {forecast.Date}");
Console.WriteLine($"forecast.TemperatureC: {forecast.TemperatureC}");
Console.WriteLine($"forecast.Summary: {forecast.Summary}");
var roundTrippedJson =
JsonSerializer.Serialize<Forecast>(forecast, options);
Console.WriteLine($"Output JSON: {roundTrippedJson}");
var forecast2 = JsonSerializer.Deserialize<Forecast2>(json);
Console.WriteLine($"forecast2.Date: {forecast2.Date}");
Console.WriteLine($"forecast2.TemperatureC: {forecast2.TemperatureC}");
Console.WriteLine($"forecast2.Summary: {forecast2.Summary}");
roundTrippedJson = JsonSerializer.Serialize<Forecast2>(forecast2);
Console.WriteLine($"Output JSON: {roundTrippedJson}");
}
}
}
// Produces output like the following example:
//
//Input JSON: { "Date":"2020-09-06T11:31:01.923395","TemperatureC":-1,"Summary":"Cold"}
//forecast.Date: 9/6/2020 11:31:01 AM
//forecast.TemperatureC: -1
//forecast.Summary: Cold
//Output JSON: { "Date":"2020-09-06T11:31:01.923395","TemperatureC":-1,"Summary":"Cold"}
//forecast2.Date: 9/6/2020 11:31:01 AM
//forecast2.TemperatureC: -1
//forecast2.Summary: Cold
//Output JSON: { "Date":"2020-09-06T11:31:01.923395","TemperatureC":-1,"Summary":"Cold"}
Imports System.Text.Json
Imports System.Text.Json.Serialization
Namespace Fields
Public Class Forecast
Public [Date] As Date
Public TemperatureC As Integer
Public Summary As String
End Class
Public Class Forecast2
<JsonInclude>
Public [Date] As Date
<JsonInclude>
Public TemperatureC As Integer
<JsonInclude>
Public Summary As String
End Class
Public NotInheritable Class Program
Public Shared Sub Main()
Dim json As String = "{""Date"":""2020-09-06T11:31:01.923395"",""TemperatureC"":-1,""Summary"":""Cold""}"
Console.WriteLine($"Input JSON: {json}")
Dim options As New JsonSerializerOptions With {
.IncludeFields = True
}
Dim forecast1 As Forecast = JsonSerializer.Deserialize(Of Forecast)(json, options)
Console.WriteLine($"forecast.Date: {forecast1.[Date]}")
Console.WriteLine($"forecast.TemperatureC: {forecast1.TemperatureC}")
Console.WriteLine($"forecast.Summary: {forecast1.Summary}")
Dim roundTrippedJson As String = JsonSerializer.Serialize(forecast1, options)
Console.WriteLine($"Output JSON: {roundTrippedJson}")
Dim forecast21 As Forecast2 = JsonSerializer.Deserialize(Of Forecast2)(json)
Console.WriteLine($"forecast2.Date: {forecast21.[Date]}")
Console.WriteLine($"forecast2.TemperatureC: {forecast21.TemperatureC}")
Console.WriteLine($"forecast2.Summary: {forecast21.Summary}")
roundTrippedJson = JsonSerializer.Serialize(forecast21)
Console.WriteLine($"Output JSON: {roundTrippedJson}")
End Sub
End Class
End Namespace
' Produces output like the following example:
'
'Input JSON: { "Date":"2020-09-06T11:31:01.923395","TemperatureC":-1,"Summary":"Cold"}
'forecast.Date: 9/6/2020 11:31:01 AM
'forecast.TemperatureC: -1
'forecast.Summary: Cold
'Output JSON: { "Date":"2020-09-06T11:31:01.923395","TemperatureC":-1,"Summary":"Cold"}
'forecast2.Date: 9/6/2020 11:31:01 AM
'forecast2.TemperatureC: -1
'forecast2.Summary: Cold
'Output JSON: { "Date":"2020-09-06T11:31:01.923395","TemperatureC":-1,"Summary":"Cold"}
Salt okunur alanları yoksaymak için genel JsonSerializerOptions.IgnoreReadOnlyFields ayarı kullanın.
System.Text.Json.NET Core 3.1'de 'de alanlar desteklenmiyor. Özel dönüştürücüler bu işlevselliği sağlar.
HttpClient ve HttpContent uzantısı yöntemleri
Yaygın işlemler, JSON yüklerini ağdan seri hale getirme ve seriden boşaltma işlemleridir. HttpClient ve HttpContent'deki uzantı yöntemleri, bu işlemleri tek bir kod satırı içinde yapmalarını sağlar. Bu uzantı yöntemleri JsonSerializerOptions için web varsayılanlarını kullanır.
Aşağıdaki örnek ve kullanımını HttpClientJsonExtensions.GetFromJsonAsync HttpClientJsonExtensions.PostAsJsonAsync göstermektedir:
using System;
using System.Net.Http;
using System.Net.Http.Json;
using System.Threading.Tasks;
namespace HttpClientExtensionMethods
{
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Username { get; set; }
public string Email { get; set; }
}
public class Program
{
public static async Task Main()
{
using HttpClient client = new()
{
BaseAddress = new Uri("https://jsonplaceholder.typicode.com")
};
// Get the user information.
User user = await client.GetFromJsonAsync<User>("users/1");
Console.WriteLine($"Id: {user.Id}");
Console.WriteLine($"Name: {user.Name}");
Console.WriteLine($"Username: {user.Username}");
Console.WriteLine($"Email: {user.Email}");
// Post a new user.
HttpResponseMessage response = await client.PostAsJsonAsync("users", user);
Console.WriteLine(
$"{(response.IsSuccessStatusCode ? "Success" : "Error")} - {response.StatusCode}");
}
}
}
// Produces output like the following example but with different names:
//
//Id: 1
//Name: Tyler King
//Username: Tyler
//Email: Tyler @contoso.com
//Success - Created
Imports System.Net.Http
Imports System.Net.Http.Json
Namespace HttpClientExtensionMethods
Public Class User
Public Property Id As Integer
Public Property Name As String
Public Property Username As String
Public Property Email As String
End Class
Public Class Program
Public Shared Async Function Main() As Task
Using client As New HttpClient With {
.BaseAddress = New Uri("https://jsonplaceholder.typicode.com")
}
' Get the user information.
Dim user1 As User = Await client.GetFromJsonAsync(Of User)("users/1")
Console.WriteLine($"Id: {user1.Id}")
Console.WriteLine($"Name: {user1.Name}")
Console.WriteLine($"Username: {user1.Username}")
Console.WriteLine($"Email: {user1.Email}")
' Post a new user.
Dim response As HttpResponseMessage = Await client.PostAsJsonAsync("users", user1)
Console.WriteLine(
$"{(If(response.IsSuccessStatusCode, "Success", "Error"))} - {response.StatusCode}")
End Using
End Function
End Class
End Namespace
' Produces output like the following example but with different names:
'
'Id: 1
'Name: Tyler King
'Username: Tyler
'Email: Tyler @contoso.com
'Success - Created
HttpContent üzerinde System.Text.Json için uzantı yöntemleri de vardır.
ve uzantı yöntemleri HttpClient HttpContent System.Text.Json .NET Core 3.1'de kullanılamaz.
Ayrıca bkz.
- System.Text.Json Genel bakış
- JsonSerializerOptions örnekleri örneği
- Büyük/küçük harf duyarlı eşlemeyi etkinleştirme
- Özellik adlarını ve değerlerini özelleştirme
- Özellikleri yoksayma
- Geçersiz JSON’a izin verme
- Taşma JSON'larını işleme veya JsonElement ya da JsonNode kullanma
- Başvuruları koruma ve döngüsel başvuruları işleme
- Sabit türler ve genel olmayan erişimciler için deserialize
- Polimorfik serileştirme
- 'den'e Newtonsoft.Json geçiş System.Text.Json
- Karakter kodlamasını özelleştirme
- DOM, Utf8JsonReader ve Utf8JsonWriter kullanma
- JSON serileştirme için özel dönüştürücüler yazma
- DateTime ve DateTimeOffset desteği
- Kaynak oluşturma kullanma
- Desteklenen koleksiyon türleri
- System.Text.Json API başvurusu
- System.Text.Json. Serileştirme API'si başvurusu