' Den ' a geçiş Newtonsoft.JsonSystem.Text.Json
Bu makalede, ' den ' e nasıl geçiş yapılacağı gösterilmektedir Newtonsoft.Json System.Text.Json .
System.Text.JsonAd alanı, JavaScript nesne gösterimi (JSON) öğesinden serileştirmek ve seri durumdan çıkarmak için işlevsellik sağlar. System.Text.JsonKitaplık .net Core 3,1 ve üzeri sürümler için çalışma zamanına dahildir. diğer hedef çerçeveler için System.Text.Json NuGet paketini yükler. Paket şunları destekler:
- .NET Standard 2,0 ve sonraki sürümler
- .NET Framework 4.7.2 ve sonraki sürümler
- .NET Core 2,0, 2,1 ve 2,2
System.Text.Json Öncelikle performans, güvenlik ve standartlar uyumluluğuna odaklanır. Varsayılan davranışta bazı önemli farklılıklar vardır ve ile özellik eşliği yoktur Newtonsoft.Json . Bazı senaryolarda System.Text.Json Şu anda yerleşik işlevselliği yoktur, ancak önerilen geçici çözümler vardır. Diğer senaryolar için geçici çözümler pratik bir şekilde yapılır.
En sık istenen özellikleri eklemeye yatırım duyuyoruz. uygulamanız eksik bir özelliğe bağımlıysa, senaryonuza yönelik desteğin eklenip eklenemediğine ulaşmak için dotnet/runtime GitHub deposundaki bir sorunu yerleştirmeyi düşünün. Zaten planlandığınızı öğrenmek için bkz. Epic sorun #43620 .
Bu makalenin çoğu, API 'yi kullanma ile JsonSerializer ilgilidir, ancak aynı zamanda JsonDocument (belge nesne MODELI veya DOM), Utf8JsonReader ve türlerini temsil eder Utf8JsonWriter .
Visual Basic ' de kullanamazsınız Utf8JsonReader , bu da özel dönüştürücüler yazamıyoruz anlamına gelir. Burada sunulan geçici çözümlerin çoğu için özel dönüştürücüler yazmanız gerekir. C# dilinde özel bir dönüştürücü yazabilir ve bunu bir Visual Basic projesine kaydedebilirsiniz. daha fazla bilgi için bkz. Visual Basic desteği.
Ve arasındaki farklar tablosu Newtonsoft.JsonSystem.Text.Json
Aşağıdaki tabloda Newtonsoft.Json Özellikler ve eşdeğerleri listelenmektedir System.Text.Json . Eşdeğerleri aşağıdaki kategorilere ayrılır:
- Yerleşik işlevsellik tarafından desteklenir. Benzer davranış alma
System.Text.Json, bir öznitelik veya genel seçenek kullanımını gerektirebilir. - Desteklenmez, geçici çözüm mümkündür. Geçici çözümler, işlevlerle tamamen eşlik sağlamayan özel dönüştürücülerdir
Newtonsoft.Json. Bunlardan bazılarının örnek kodu örnek olarak verilmiştir. Bu özelliklerden yararlandıysanızNewtonsoft.Jsongeçiş, .NET nesne modellerinizde veya diğer kod değişikliklerinde değişiklik yapılmasını gerektirir. - Desteklenmez, geçici çözüm pratik veya mümkün değildir. Bu özelliklerden yararlandıysanız
Newtonsoft.Jsongeçiş önemli değişiklikler yapılmadan mümkün olmayacaktır.
| Newtonsoft.Json özelliği | System.Text.Json değerinin |
|---|---|
| Varsayılan olarak büyük/küçük harfe duyarsız seri hale | ✔️ Propertynamecaseduyarsız genel ayarı |
| Camel-Case Özellik adları | ✔️ Propertynamingpolicy genel ayarı |
| En az karakter kaçış | ✔️ katı karakter kaçış, yapılandırılabilir |
NullValueHandling.Ignore Genel ayar |
✔️ DefaultIgnoreCondition genel seçeneği |
| Açıklamalara izin ver | ✔️ ReadCommentHandling genel ayarı |
| Sondaki virgüllerin kullanılmasına izin ver | ✔️ Allowtrailingvirgüller genel ayarı |
| Özel dönüştürücü kaydı | ✔️ öncelik sırası farklı |
| Varsayılan olarak en fazla derinlik yok | ✔️ varsayılan en yüksek derinlik 64, yapılandırılabilir |
PreserveReferencesHandling Genel ayar |
✔️ Referencehandling genel ayarı |
| Tırnak işaretleri içindeki sayıları seri hale getirme veya serisini kaldırma | ✔️ numberhandling genel ayarı, [JsonNumberHandling] özniteliği |
| Sabit sınıflar ve yapılar için seri durumdan çıkarma | ✔️ Jsonconstructor, C# 9 kayıtları |
| Alanlar için destek | ✔️ ıncludefields genel ayarı, [Jsonınclude] özniteliği |
DefaultValueHandling Genel ayar |
✔️ DefaultIgnoreCondition genel ayarı |
NullValueHandling ayar açık [JsonProperty] |
✔️ Jsonıgnore özniteliği |
DefaultValueHandling ayar açık [JsonProperty] |
✔️ Jsonıgnore özniteliği |
DictionaryDize olmayan anahtarla seri durumdan çıkarma |
✔️ destekleniyor |
| Ortak olmayan özellik ayarlayıcıları ve alıcılar için destek | ✔️ Jsonınclude özniteliği |
[JsonConstructor] özniteliği |
✔️ [Jsonconstructor] özniteliği |
ReferenceLoopHandling Genel ayar |
✔️ Referencehandling genel ayarı |
| Geri Çağırmalar | geri çağırmaları ✔️ |
| NaN, Infinity,-Infinity | ✔️ destekleniyor |
| Geniş kapsamlı türler için destek | ⚠️Bazı türler için özel dönüştürücüler gerekir |
| Polimorfik serileştirme | ⚠️Desteklenmez, geçici çözüm, örnek |
| Polimorfik seri kaldırma | ⚠️Desteklenmez, geçici çözüm, örnek |
Çıkarılan türden özellikleri seri durumdan çıkar object |
⚠️Desteklenmez, geçici çözüm, örnek |
JSON null sabit değerinin null yapılamayan değer türlerine serisini kaldırma |
⚠️Desteklenmez, geçici çözüm, örnek |
Requiredözniteliği üzerinde ayarlama [JsonProperty] |
⚠️Desteklenmez, geçici çözüm, örnek |
DefaultContractResolver özellikleri yoksaymak için |
⚠️Desteklenmez, geçici çözüm, örnek |
DateTimeZoneHandling, DateFormatString Ayarlar |
⚠️Desteklenmez, geçici çözüm, örnek |
JsonConvert.PopulateObject yöntemi |
⚠️Desteklenmez, geçici çözüm |
ObjectCreationHandling Genel ayar |
⚠️Desteklenmez, geçici çözüm |
| Ayarlayıcısız koleksiyonlara Ekle | ⚠️Desteklenmez, geçici çözüm |
| Snake-Case Özellik adları | ⚠️Desteklenmez, geçici çözüm |
Öznitelikler için destek System.Runtime.Serialization |
❌ Desteklenmez |
MissingMemberHandling Genel ayar |
❌ Desteklenmez |
| Tırnak işaretleri olmadan özellik adlarına izin ver | ❌ Desteklenmez |
| Dize değerlerinin çevresinde tek tırnak işaretlerine izin ver | ❌ Desteklenmez |
| Dize özellikleri için dize olmayan JSON değerlerine izin ver | ❌ Desteklenmez |
TypeNameHandling.All Genel ayar |
❌ Desteklenmez |
Sorgu desteği JsonPath |
❌ Desteklenmez |
| Yapılandırılabilir sınırlar | ❌ Desteklenmez |
| Newtonsoft.Json özelliği | System.Text.Json değerinin |
|---|---|
| Varsayılan olarak büyük/küçük harfe duyarsız seri hale | ✔️ Propertynamecaseduyarsız genel ayarı |
| Camel-Case Özellik adları | ✔️ Propertynamingpolicy genel ayarı |
| En az karakter kaçış | ✔️ katı karakter kaçış, yapılandırılabilir |
NullValueHandling.Ignore Genel ayar |
✔️ DefaultIgnoreCondition genel seçeneği |
| Açıklamalara izin ver | ✔️ ReadCommentHandling genel ayarı |
| Sondaki virgüllerin kullanılmasına izin ver | ✔️ Allowtrailingvirgüller genel ayarı |
| Özel dönüştürücü kaydı | ✔️ öncelik sırası farklı |
| Varsayılan olarak en fazla derinlik yok | ✔️ varsayılan en yüksek derinlik 64, yapılandırılabilir |
PreserveReferencesHandling Genel ayar |
✔️ Referencehandling genel ayarı |
| Tırnak işaretleri içindeki sayıları seri hale getirme veya serisini kaldırma | ✔️ numberhandling genel ayarı, [JsonNumberHandling] özniteliği |
| Sabit sınıflar ve yapılar için seri durumdan çıkarma | ✔️ Jsonconstructor, C# 9 kayıtları |
| Alanlar için destek | ✔️ ıncludefields genel ayarı, [Jsonınclude] özniteliği |
DefaultValueHandling Genel ayar |
✔️ DefaultIgnoreCondition genel ayarı |
NullValueHandling ayar açık [JsonProperty] |
✔️ Jsonıgnore özniteliği |
DefaultValueHandling ayar açık [JsonProperty] |
✔️ Jsonıgnore özniteliği |
DictionaryDize olmayan anahtarla seri durumdan çıkarma |
✔️ destekleniyor |
| Ortak olmayan özellik ayarlayıcıları ve alıcılar için destek | ✔️ Jsonınclude özniteliği |
[JsonConstructor] özniteliği |
✔️ [Jsonconstructor] özniteliği |
| NaN, Infinity,-Infinity | ✔️ destekleniyor |
| Geniş kapsamlı türler için destek | ⚠️Bazı türler için özel dönüştürücüler gerekir |
| Polimorfik serileştirme | ⚠️Desteklenmez, geçici çözüm, örnek |
| Polimorfik seri kaldırma | ⚠️Desteklenmez, geçici çözüm, örnek |
Çıkarılan türden özellikleri seri durumdan çıkar object |
⚠️Desteklenmez, geçici çözüm, örnek |
JSON null sabit değerinin null yapılamayan değer türlerine serisini kaldırma |
⚠️Desteklenmez, geçici çözüm, örnek |
Requiredözniteliği üzerinde ayarlama [JsonProperty] |
⚠️Desteklenmez, geçici çözüm, örnek |
DefaultContractResolver özellikleri yoksaymak için |
⚠️Desteklenmez, geçici çözüm, örnek |
DateTimeZoneHandling, DateFormatString Ayarlar |
⚠️Desteklenmez, geçici çözüm, örnek |
| Geri Çağırmalar | ⚠️Desteklenmez, geçici çözüm, örnek |
JsonConvert.PopulateObject yöntemi |
⚠️Desteklenmez, geçici çözüm |
ObjectCreationHandling Genel ayar |
⚠️Desteklenmez, geçici çözüm |
| Ayarlayıcısız koleksiyonlara Ekle | ⚠️Desteklenmez, geçici çözüm |
| Snake-Case Özellik adları | ⚠️Desteklenmez, geçici çözüm |
ReferenceLoopHandling Genel ayar |
❌ Desteklenmez |
Öznitelikler için destek System.Runtime.Serialization |
❌ Desteklenmez |
MissingMemberHandling Genel ayar |
❌ Desteklenmez |
| Tırnak işaretleri olmadan özellik adlarına izin ver | ❌ Desteklenmez |
| Dize değerlerinin çevresinde tek tırnak işaretlerine izin ver | ❌ Desteklenmez |
| Dize özellikleri için dize olmayan JSON değerlerine izin ver | ❌ Desteklenmez |
TypeNameHandling.All Genel ayar |
❌ Desteklenmez |
Sorgu desteği JsonPath |
❌ Desteklenmez |
| Yapılandırılabilir sınırlar | ❌ Desteklenmez |
| Newtonsoft.Json özelliği | System.Text.Json değerinin |
|---|---|
| Varsayılan olarak büyük/küçük harfe duyarsız seri hale | ✔️ Propertynamecaseduyarsız genel ayarı |
| Camel-Case Özellik adları | ✔️ Propertynamingpolicy genel ayarı |
| En az karakter kaçış | ✔️ katı karakter kaçış, yapılandırılabilir |
NullValueHandling.Ignore Genel ayar |
✔️ ıgnorenullvalues genel seçeneği |
| Açıklamalara izin ver | ✔️ ReadCommentHandling genel ayarı |
| Sondaki virgüllerin kullanılmasına izin ver | ✔️ Allowtrailingvirgüller genel ayarı |
| Özel dönüştürücü kaydı | ✔️ öncelik sırası farklı |
| Varsayılan olarak en fazla derinlik yok | ✔️ varsayılan en yüksek derinlik 64, yapılandırılabilir |
| Geniş kapsamlı türler için destek | ⚠️Bazı türler için özel dönüştürücüler gerekir |
| Dizeleri sayı olarak seri durumdan çıkarma | ⚠️Desteklenmez, geçici çözüm, örnek |
DictionaryDize olmayan anahtarla seri durumdan çıkarma |
⚠️Desteklenmez, geçici çözüm, örnek |
| Polimorfik serileştirme | ⚠️Desteklenmez, geçici çözüm, örnek |
| Polimorfik seri kaldırma | ⚠️Desteklenmez, geçici çözüm, örnek |
Çıkarılan türden özellikleri seri durumdan çıkar object |
⚠️Desteklenmez, geçici çözüm, örnek |
JSON null sabit değerinin null yapılamayan değer türlerine serisini kaldırma |
⚠️Desteklenmez, geçici çözüm, örnek |
| Sabit sınıflar ve yapılar için seri durumdan çıkarma | ⚠️Desteklenmez, geçici çözüm, örnek |
[JsonConstructor] özniteliği |
⚠️Desteklenmez, geçici çözüm, örnek |
Requiredözniteliği üzerinde ayarlama [JsonProperty] |
⚠️Desteklenmez, geçici çözüm, örnek |
NullValueHandlingözniteliği üzerinde ayarlama [JsonProperty] |
⚠️Desteklenmez, geçici çözüm, örnek |
DefaultValueHandlingözniteliği üzerinde ayarlama [JsonProperty] |
⚠️Desteklenmez, geçici çözüm, örnek |
DefaultValueHandling Genel ayar |
⚠️Desteklenmez, geçici çözüm, örnek |
DefaultContractResolver özellikleri yoksaymak için |
⚠️Desteklenmez, geçici çözüm, örnek |
DateTimeZoneHandling, DateFormatString Ayarlar |
⚠️Desteklenmez, geçici çözüm, örnek |
| Geri Çağırmalar | ⚠️Desteklenmez, geçici çözüm, örnek |
| Ortak ve genel olmayan alanlar için destek | ⚠️Desteklenmez, geçici çözüm |
| Ortak olmayan özellik ayarlayıcıları ve alıcılar için destek | ⚠️Desteklenmez, geçici çözüm |
JsonConvert.PopulateObject yöntemi |
⚠️Desteklenmez, geçici çözüm |
ObjectCreationHandling Genel ayar |
⚠️Desteklenmez, geçici çözüm |
| Ayarlayıcısız koleksiyonlara Ekle | ⚠️Desteklenmez, geçici çözüm |
| Snake-Case Özellik adları | ⚠️Desteklenmez, geçici çözüm |
| NaN, Infinity,-Infinity | ⚠️Desteklenmez, geçici çözüm |
PreserveReferencesHandling Genel ayar |
❌ Desteklenmez |
ReferenceLoopHandling Genel ayar |
❌ Desteklenmez |
Öznitelikler için destek System.Runtime.Serialization |
❌ Desteklenmez |
MissingMemberHandling Genel ayar |
❌ Desteklenmez |
| Tırnak işaretleri olmadan özellik adlarına izin ver | ❌ Desteklenmez |
| Dize değerlerinin çevresinde tek tırnak işaretlerine izin ver | ❌ Desteklenmez |
| Dize özellikleri için dize olmayan JSON değerlerine izin ver | ❌ Desteklenmez |
TypeNameHandling.All Genel ayar |
❌ Desteklenmez |
Sorgu desteği JsonPath |
❌ Desteklenmez |
| Yapılandırılabilir sınırlar | ❌ Desteklenmez |
Bu, özelliklerin kapsamlı bir listesi değildir Newtonsoft.Json . listede GitHub sorunları veya StackOverflow gönderilerinde istenmiş birçok senaryo bulunur. Burada listelenen senaryolardan biri için şu anda örnek kodu olmayan bir geçici çözüm uygularsanız ve çözümünüzü paylaşmak istiyorsanız, bu sayfanın altındaki geri bildirim bölümünde Bu sayfayı seçin. bu belgede GitHub depoda bir sorun oluşturur ve bu sayfadaki geri bildirim bölümünde de listelenir.
Varsayılan JsonSerializer davranışındaki farklılıklar Newtonsoft.Json
System.Text.Json Varsayılan olarak katı olur ve arayan adına tahmin veya yorumlamayı önler, belirleyici davranışı vurgulayarak. Kitaplık, performans ve güvenlik için kasıtlı olarak bu şekilde tasarlanmıştır. Newtonsoft.Json Varsayılan olarak esnektir. Tasarımda bu temel fark, varsayılan davranıştaki aşağıdaki belirli farklılıklardan birçoğın arkasında bulunur.
Büyük/küçük harfe duyarsız seri hale
Seri durumdan çıkarma sırasında, Newtonsoft.Json Varsayılan olarak büyük/küçük harfe duyarsız Özellik adı eşleştirmeyi yapar. System.Text.JsonVarsayılan değer büyük/küçük harfe duyarlıdır ve tam bir eşleşme yaptığından daha iyi performans sağlar. Büyük/küçük harfe duyarsız eşleşme yapma hakkında daha fazla bilgi için bkz. büyük/küçük harfe duyarsız Özellik eşleştirme.
ASP.NET Core kullanarak dolaylı olarak kullanıyorsanız, gibi bir davranış elde etmek System.Text.Json için herhangi bir şey yapmaya gerek Newtonsoft.Json yok. ASP.NET Core, kullandığında büyük/büyük/büyük harf özellik adları ve büyük/büyük/büyük harfe duyarlı olmayan eşleştirme ayarlarını System.Text.Json belirtir.
ASP.NET Core, tırnak içine alınarak belirtilen sayıların seriden serinin seriden nasıl seriden alınarak serileştirilene kadar varsayılan olarak olanaklı olduğunu da sağlar.
Minimum karakter kaçışı
Serileştirme sırasında Newtonsoft.Json karakterlerin kaçış karakterine kaçış karakteri olmadan izin verme konusunda nispeten izin vermesine izin vermedir. Başka bir ifadeyle, karakterleri karakterin \uxxxx xxxx kod noktasıyla değiştirmez. Kaçış karakteri olduğunda, karakterin önünde bir yayarak (örneğin, olur) \ " bunu \" yapar. System.Text.Json , siteler arası betik (XSS) veya bilgilerin açığa çıkması saldırılarına karşı derinlemesine savunma korumaları sağlamak için varsayılan olarak daha fazla karakterden kaçış karakteri kullanır ve bunu altı karakterli diziyi kullanarak yapar. System.Text.Json varsayılan olarak ASCII olmayan tüm karakterlerin kaçış karakteridir, bu nedenle içinde kullanıyorsanız herhangi bir şey yapmak zorunda StringEscapeHandling.EscapeNonAscii Newtonsoft.Json değildir. System.Text.Json varsayılan olarak HTML'ye duyarlı karakterlerden de kaçış karakteri kullanır. Varsayılan davranışı geçersiz kılma hakkında bilgi için System.Text.Json bkz. Karakter kodlamasını özelleştirme.
Yorumlar
Deserialization sırasında, Newtonsoft.Json varsayılan olarak JSON'daki yorumları yoksayar. System.Text.Json RFC 8259 belirtimi bunları içermemesi nedeniyle varsayılan olarak açıklamalar için özel durumlar oluşturur. Açıklamalara izin verme hakkında bilgi için bkz. Açıklamalara ve sonda virgüllere izin ver.
Sonda virgül
Deserialization sırasında, Newtonsoft.Json varsayılan olarak sonda virgülleri yoksayar. Ayrıca, birden çok sonda virgül (örneğin, ) [{"Color":"Red"},{"Color":"Green"},,] yoksayar. System.Text.Json RFC 8259 belirtimi izin vermemesi nedeniyle, varsayılan değer sonda virgüller için özel durumlar üretmektir. Bunları kabul etme hakkında bilgi System.Text.Json için bkz. Açıklamalara ve sonda virgüllere izin ver. Birden çok sonda virgüle izin vermenin bir yolu yoktur.
Dönüştürücü kayıt önceliği
Özel Newtonsoft.Json dönüştürücüler için kayıt önceliği aşağıdaki gibidir:
- Özelliğin özniteliği
- Türe göre öznitelik
- Dönüştürücüler koleksiyonu
Bu sıra, koleksiyonda özel bir dönüştürücünün tür düzeyinde bir öznitelik uygulanarak kaydedilen bir dönüştürücü Converters tarafından geçersiz kılınmış olduğu anlamına gelir. Bu kayıtların her ikisi de özellik düzeyinde bir öznitelik tarafından geçersiz kılınır.
Özel System.Text.Json dönüştürücüler için kayıt önceliği farklıdır:
- Özelliğin özniteliği
- Converters Koleksiyon
- Türe göre öznitelik
Buradaki fark, koleksiyonda özel bir dönüştürücünün Converters tür düzeyinde bir özniteliği geçersiz kılmasıdır. Bu öncelik sırası ardındaki amaç, çalışma zamanı değişikliklerini tasarım zamanı seçimlerini geçersiz kılmaktır. Önceliği değiştirmenin bir yolu yoktur.
Özel dönüştürücü kaydı hakkında daha fazla bilgi için bkz. Özel dönüştürücü kaydetme.
En fazla derinlik
En son sürümünde Newtonsoft.Json varsayılan olarak en fazla 64 derinlik sınırı vardır. System.Text.Json ayrıca varsayılan sınırı 64'tir ve ayarıyla JsonSerializerOptions.MaxDepth yapılandırılabilir.
Dolaylı olarak ASP.NET Core System.Text.Json kullanıyorsanız, varsayılan maksimum derinlik sınırı 32'dir. Varsayılan değer, model bağlama ile aynıdır ve JsonOptions sınıfında ayarlanır.
JSON dizeleri (özellik adları ve dize değerleri)
Deserialization sırasında, çift tırnak içine, tek tırnak içine veya tırnak olmadan özellik Newtonsoft.Json adlarını kabul eder. Çift tırnak veya tek tırnak içine alınarak dize değerlerini kabul eder. Örneğin, Newtonsoft.Json aşağıdaki JSON'u kabul eder:
{
"name1": "value",
'name2': "value",
name3: 'value'
}
System.Text.Json yalnızca özellik adlarını ve dize değerlerini çift tırnak içinde kabul eder çünkü bu biçim RFC 8259 belirtimi için gereklidir ve geçerli JSON olarak kabul edilen tek biçimdir.
Tek tırnak içine alınmış bir değer, aşağıdaki iletiyle bir JsonException ile sonuç verir:
''' is an invalid start of a value.
Dize özellikleri için dize olmayan değerler
Newtonsoft.Json , dize türünün özelliklerine yönelik olarak, bir sayı veya değişmez değerler ve gibi dize olmayan değerleri kabul true false eder. Aşağıda, aşağıdaki sınıfa başarıyla serisini silen bir JSON Newtonsoft.Json örneği ve ardından verİlemektedir:
{
"String1": 1,
"String2": true,
"String3": false
}
public class ExampleClass
{
public string String1 { get; set; }
public string String2 { get; set; }
public string String3 { get; set; }
}
System.Text.Json dize olmayan değerleri dize özelliklerine desrialize değil. Dize alanı için alınan dize olmayan bir değer, aşağıdaki iletiyle bir JsonException ile sonuç verir:
The JSON value could not be converted to System.String.
JsonSerializer kullanan senaryolar
Aşağıdaki senaryolardan bazıları yerleşik işlevler tarafından destekilmez, ancak geçici çözümler mümkündür. Geçici çözümler, işlevlerle tameşlik sağlaymayacak özel Newtonsoft.Json dönüştürücülerdir. Bunların bazıları için örnek kod örnek olarak sağlanır. Bu özelliklere Newtonsoft.Json güveniyorsanız, geçiş için .NET nesne modellerinde veya diğer kod değişikliklerinde değişiklik yapılması gerekir.
Aşağıdaki senaryolardan bazıları için geçici çözümler pratik veya mümkün değildir. Bu özelliklere Newtonsoft.Json güveniyorsanız, önemli değişiklikler olmadan geçiş mümkün olmayacaktır.
Tırnak içinde sayılara izin verme veya yazma
Newtonsoft.Json , JSON dizeleri (tırnak içine alınmış) ile temsil edilen sayıları seri hale getirebiliyor veya seriden seriden ediyor olabilir. Örneğin, kabul edilebilir: {"DegreesCelsius":"23"} yerine {"DegreesCelsius":23} . Bu davranışı içinde etkinleştirmek için System.Text.Json veya olarak ayarlayın veya JsonSerializerOptions.NumberHandling WriteAsString AllowReadingFromString [JsonNumberHandling] özniteliğini kullanın.
ASP.NET Core kullanarak dolaylı olarak kullanıyorsanız, gibi bir davranış elde etmek System.Text.Json için herhangi bir şey yapmaya gerek Newtonsoft.Json yok. ASP.NET Core, kullandığında web varsayılanlarını belirtir ve System.Text.Json web varsayılanları tırnak içine alınan sayılara izin verir.
Daha fazla bilgi için bkz. Tırnak içinde sayılara izin verme veya yazma.
Newtonsoft.Json , JSON dizeleri (tırnak içine alınmış) ile temsil edilen sayıları seri hale getirebiliyor veya seriden seriden ediyor olabilir. Örneğin, kabul edilebilir: {"DegreesCelsius":"23"} yerine {"DegreesCelsius":23} . System.Text.Json.NET Core 3.1'de bu davranışı etkinleştirmek için aşağıdaki örnekte olduğu gibi özel bir dönüştürücü uygulama. Dönüştürücü, olarak tanımlanan özellikleri long işler:
- Bunları JSON dizeleri olarak seri hale getirme.
- Serileştirme sırasında tırnak içinde JSON numaralarını ve sayıları kabul eder.
using System;
using System.Buffers;
using System.Buffers.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace SystemTextJsonSamples
{
public class LongToStringConverter : JsonConverter<long>
{
public override long Read(
ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
ReadOnlySpan<byte> span =
reader.HasValueSequence ? reader.ValueSequence.ToArray() : reader.ValueSpan;
if (Utf8Parser.TryParse(span, out long number, out int bytesConsumed) &&
span.Length == bytesConsumed)
{
return number;
}
if (long.TryParse(reader.GetString(), out number))
{
return number;
}
}
return reader.GetInt64();
}
public override void Write(
Utf8JsonWriter writer, long longValue, JsonSerializerOptions options) =>
writer.WriteStringValue(longValue.ToString());
}
}
Tek tek özelliklerde bir öznitelik kullanarak veya long dönüştürücüyü koleksiyona ekleyerek bu özel dönüştürücüyü Converters kaydedin.
Deserializing'da kullanmak için oluşturucu belirtme
özniteliği, Newtonsoft.Json [JsonConstructor] bir POCO'yarialize edilirken çağrılmak için hangi oluşturucu belirtmenize olanak sağlar.
System.Text.Json ayrıca [JsonConstructor] özniteliğine de sahip. Daha fazla bilgi için bkz. Sabit türler ve Kayıtlar.
System.Text.Json .NET Core 3.1'de yalnızca parametresiz oluşturucular destekler. Geçici bir çözüm olarak, özel bir dönüştürücüde ihtiyacınız olan oluşturucuları çağırebilirsiniz. Sabit sınıflar ve yapılar için Deserialize örneğine bakın.
Bir özelliği koşullu olarak yoksayma
Newtonsoft.Json , serileştirme veya seriyi kaldıran bir özelliği koşullu olarak yoksaymak için çeşitli yolları vardır:
DefaultContractResolver, rastgele ölçütlere göre dahil etmek veya yoksaymak için özellikleri seçmenize olanak sağlar.- üzerinde
NullValueHandlingveDefaultValueHandlingJsonSerializerSettingsayarları, tüm null-değer veya varsayılan-değer özelliklerinin yoksayılır gerektiğini belirtmenize izin verir. - özniteliğinin
NullValueHandlingDefaultValueHandlingve[JsonProperty]ayarları, null veya varsayılan değer olarak ayarlanırken yoksayılacak tek tek özellikleri belirtmenize izin verir.
System.Text.Json seri hale getirme sırasında özellikleri veya alanları yoksaymak için aşağıdaki yolları sağlar:
- Bir özellikte [JsonIgnore] özniteliği, özelliğin serileştirme sırasında JSON'dan atlanır.
- IgnoreReadOnlyProperties genel seçeneği tüm salt okunur özellikleri yoksaymanizi sağlar.
- Alanları dahil ediyorsanız, genel JsonSerializerOptions.IgnoreReadOnlyFields seçenek tüm salt okunur alanları yoksaymanizi sağlar.
- Genel
DefaultIgnoreConditionseçenek, varsayılan değerleri olan tüm değer türü özelliklerini yoksayma veyanull değerlerine sahip tüm başvuru türü özelliklerini yoksaymanizi sağlar.
System.Text.Json .NET Core 3.1'de, seri hale getirme sırasında özellikleri yoksaymak için aşağıdaki yolları sağlar:
- Bir özellikte [JsonIgnore] özniteliği, özelliğin serileştirme sırasında JSON'dan atlanır.
- IgnoreNullValues genel seçeneği, tüm null değer özelliklerini yoksaymanizi sağlar.
IgnoreNullValues.NET 5 ve sonraki sürümlerde kullanım dışıdır, bu nedenle IntelliSense tarafından gösterilmez. Null değerleri yoksaymak için bkz. .NET 5 ve sonraki tüm null değer özelliklerini yoksayma. - IgnoreReadOnlyProperties genel seçeneği tüm salt okunur özellikleri yoksaymanizi sağlar.
Bu seçenekler şunları sağlar:
- Çalışma zamanında değerlendirilen rastgele ölçütlere göre seçilen özellikleri yoksayın.
- Tür için varsayılan değere sahip tüm özellikleri yoksayın.
- Tür için varsayılan değere sahip seçili özellikleri yoksayın.
- Değerleri null ise seçili özellikleri yoksayın.
- Çalışma zamanında değerlendirilen rastgele ölçütlere göre seçili özellikleri yoksayın.
Bu işlevsellik için özel bir dönüştürücü yazabilirsiniz. İşte bu yaklaşımı gösteren örnek bir POCO ve özel dönüştürücü.
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
}
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace SystemTextJsonSamples
{
public class WeatherForecastRuntimeIgnoreConverter : JsonConverter<WeatherForecast>
{
public override WeatherForecast Read(
ref Utf8JsonReader reader,
Type typeToConvert,
JsonSerializerOptions options)
{
if (reader.TokenType != JsonTokenType.StartObject)
{
throw new JsonException();
}
var wf = new WeatherForecast();
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.EndObject)
{
return wf;
}
if (reader.TokenType == JsonTokenType.PropertyName)
{
string propertyName = reader.GetString();
reader.Read();
switch (propertyName)
{
case "Date":
DateTimeOffset date = reader.GetDateTimeOffset();
wf.Date = date;
break;
case "TemperatureCelsius":
int temperatureCelsius = reader.GetInt32();
wf.TemperatureCelsius = temperatureCelsius;
break;
case "Summary":
string summary = reader.GetString();
wf.Summary = string.IsNullOrWhiteSpace(summary) ? "N/A" : summary;
break;
}
}
}
throw new JsonException();
}
public override void Write(Utf8JsonWriter writer, WeatherForecast wf, JsonSerializerOptions options)
{
writer.WriteStartObject();
writer.WriteString("Date", wf.Date);
writer.WriteNumber("TemperatureCelsius", wf.TemperatureCelsius);
if (!string.IsNullOrWhiteSpace(wf.Summary) && wf.Summary != "N/A")
{
writer.WriteString("Summary", wf.Summary);
}
writer.WriteEndObject();
}
}
}
Dönüştürücü, Summary değeri null, boş bir dize veya "N/A" ise, özelliğin Serileştirmeden atlanmasına neden olur.
Bu özel dönüştürücüyü sınıfında bir özniteliği kullanarak veya dönüştürücüyü koleksiyona ekleyerek kaydedin Converters .
Bu yaklaşım aşağıdaki durumlarda ek mantık gerektirir:
- POCO, karmaşık özellikler içerir.
- Gibi öznitelikleri
[JsonIgnore]veya özel kodlayıcılar gibi seçenekleri işlemeniz gerekir.
Ortak ve genel olmayan alanlar
Newtonsoft.Json alanları seri hale getirmek ve seri durumdan çıkarmak için özellikleri.
İçinde System.Text.Json , JsonSerializerOptions.IncludeFields serileştirme veya seri durumdan çıkarma sırasında ortak alanları dahil etmek için genel ayarını veya [jsonınclude] özniteliğini kullanın. Bir örnek için bkz. içerme alanları.
System.Text.Json .NET Core 3,1 ' de yalnızca ortak özelliklerle birlikte kullanılabilir. Özel dönüştürücüler, bu işlevselliği sağlayabilir.
Nesne başvurularını koruma ve döngüleri işleme
Varsayılan olarak, Newtonsoft.Json değere göre serileştirir. Örneğin, bir nesne aynı nesneye bir başvuru içeren iki özellik içeriyorsa Person , bu Person nesnenin ÖZELLIKLERININ değerleri JSON içinde yinelenir.
Newtonsoft.Json , PreserveReferencesHandling JsonSerializerSettings başvuruya göre serileştirmenize olanak sağlayan üzerinde bir ayarı vardır:
- İlk nesne için oluşturulan JSON 'a bir tanımlayıcı meta verileri eklenir
Person. - İkinci nesne için oluşturulan JSON,
Personözellik değerleri yerine bu tanımlayıcıya bir başvuru içerir.
Newtonsoft.Json Ayrıca, ReferenceLoopHandling bir özel durum oluşturmak yerine döngüsel başvuruları yoksaymanıza imkan tanıyan bir ayara sahiptir.
Başvuruları korumak ve ' de döngüsel başvuruları işlemek için System.Text.Json , JsonSerializerOptions.ReferenceHandler olarak ayarlayın Preserve . ReferenceHandler.PreserveAyarı, ile eşdeğerdir PreserveReferencesHandling = PreserveReferencesHandling.All Newtonsoft.Json .
ReferenceHandler.IgnoreCyclesSeçeneğinin şuna benzer davranışı vardır Newtonsoft.Json ReferenceLoopHandling.Ignore . Tek fark, System.Text.Json uygulamanın başvuru döngülerini null nesne başvurusunu yok saymakla değil JSON belirteciyle değiştirmesidir. Daha fazla bilgi için bkz. Döngüsel başvuruları yoksay.
Newtonsoft.Json ReferenceResolvergibi, System.Text.Json.Serialization.ReferenceResolver sınıfı serileştirme ve seri durumundan çıkarma için başvuruları koruma davranışını tanımlar. Özel davranışı belirtmek için türetilmiş bir sınıf oluşturun. Bir örnek için bkz. GuidReferenceResolver.
Bazı ilgili Newtonsoft.Json özellikler desteklenmez:
Daha fazla bilgi için bkz. başvuruları koruma ve döngüsel başvuruları işleme.
- JsonPropertyAttribute. IsReference
- JsonPropertyAttribute. ReferenceLoopHandling
- JsonSerializerSettings. ReferenceLoopHandling
Daha fazla bilgi için bkz. başvuruları koruma ve döngüsel başvuruları işleme.
System.Text.Json .NET Core 3,1 yalnızca değere göre serileştirme destekler ve döngüsel başvurular için bir özel durum oluşturur.
Dize olmayan anahtarla sözlük
Hem hem de Newtonsoft.Json System.Text.Json türündeki koleksiyonları destekler Dictionary<TKey, TValue> . Ancak, içinde System.Text.Json , TKey özel bir tür değil, temel bir tür olmalıdır. Daha fazla bilgi için bkz. desteklenen anahtar türleri.
Dikkat
Bir WHERE 'nin seri durumundan çıkarma, Dictionary<TKey, TValue> TKey string tüketen uygulamada bir güvenlik açığı ortaya çıkarabilir. Daha fazla bilgi için bkz. DotNet/Runtime # 4761.
Newtonsoft.Json türündeki koleksiyonları destekler Dictionary<TKey, TValue> . .NET Core 3,1 ' deki sözlük koleksiyonları için yerleşik destek System.Text.Json ile sınırlıdır Dictionary<string, TValue> . Diğer bir deyişle, anahtar bir dize olmalıdır.
.NET Core 3,1 ' deki anahtar olarak tamsayı veya diğer tür içeren bir sözlüğü desteklemek için, özel dönüştürücüler yazmabölümünde örnek gibi bir dönüştürücü oluşturun.
Yerleşik destek olmadan türler
System.Text.Json , aşağıdaki türler için yerleşik destek sağlamaz:
- DataTable ve ilgili türler (daha fazla bilgi için bkz. Desteklenen koleksiyon türleri)
- Ayırt edici birleşimlergibi F # türleri. Kayıt türleri ve anonim kayıt türleri , sabit bir Pocos olarak değerlendirilir ve bu nedenle desteklenir.
- Ayırt edici birleşimler, kayıt türlerive anonim kayıt türlerigibi F # türleri.
- ExpandoObject
- TimeZoneInfo
- BigInteger
- TimeSpan
- DBNull
- Type
- ValueTuple ve ilişkili genel türleri
Özel dönüştürücüler, yerleşik desteği olmayan türler için uygulanabilir.
Polimorfik serileştirme
Newtonsoft.Json otomatik olarak polimorfik serileştirme yapar. ' Nin sınırlı çok biçimli serileştirme özellikleri hakkında daha fazla bilgi için System.Text.Json bkz. türetilmiş sınıfların serileştirme özellikleri.
Açıklanan geçici çözüm, türü olarak türetilmiş sınıflar içerebilen özellikleri tanımlamaktır object . Bu mümkün değilse, diğer bir seçenek de Write özel dönüştürücüler yazmaiçindeki örnek gibi tüm devralma türü hiyerarşisi için bir yöntemle dönüştürücü oluşturmaktır.
Polimorfik seri kaldırma
Newtonsoft.Json``TypeNameHandlingserileştirme SıRASıNDA JSON 'a tür adı meta verileri ekleyen bir ayara sahiptir. Seri durumdan çıkarma sırasında çok biçimli seri kaldırma işlemi yaparken meta verileri kullanır. System.Text.Json çok sayıda polimorfik serileştirme , ancak polimorfik seri hale getirme işlemi yapabilir.
Polimorfik serisini desteklemek için özel dönüştürücüler yazmabölümünde örnek gibi bir dönüştürücü oluşturun.
Nesne özelliklerinin serisini kaldırma
Newtonsoft.JsonSeri Object hale geldiğinde:
- , JSON yükünde (dışındaki) ilkel değerlerin türünü
nullve depolananstring,long,double,booleanveyaDateTimepaketlenmiş nesne olarak döndürür. İlkel değerler , JSON numarası, dize,, veya gıbı tek JSON değerleridirtruefalsenull. JObjectJArrayJSON yükünde karmaşık değerler için bir veya döndürür. Karmaşık değerler , küme ayracı () içinde JSON anahtar-değer çiftleri{}veya köşeli ayraç () içindeki değer listelerinde yer alan koleksiyonlardır[]. Küme ayraçları ve köşeli ayraçlar içindeki Özellikler ve değerler ek özelliklere veya değerlere sahip olabilir.- Yükün JSON sabit değeri olduğunda bir null başvurusu döndürür
null.
System.Text.JsonJsonElementseri durumdan çıkarma sırasında hem ilkel hem de karmaşık değerler için paketlenmiş bir depolar Object , örneğin:
- Bir
objectözellik. objectSözlük değeri.- Bir
objectdizi değeri. - Bir kök
object.
Ancak, System.Text.Json null ile aynı şekilde davranır Newtonsoft.Json ve yük null içindeki JSON değişmez değeri olduğunda bir null başvurusu döndürür.
Özellikler için tür çıkarımı uygulamak için object , özel dönüştürücüler yazmabölümünde örnek gibi bir dönüştürücü oluşturun.
Null olamayan tür için null serisini kaldırma
Newtonsoft.Json Aşağıdaki senaryoda özel durum oluşturmaz:
NullValueHandling, olarak ayarlanırIgnoreve- Seri durumdan çıkarma sırasında JSON null yapılamayan bir değer türü için null değer içerir.
Aynı senaryoda System.Text.Json bir özel durum oluşturur. (' De karşılık gelen null işleme ayarı System.Text.Json JsonSerializerOptions.IgnoreNullValues = true .)
Hedef türün sahibiyseniz, en iyi geçici çözüm, özelliğin boş değer atanabilir olması (örneğin, int olarak değiştirin int? ).
Farklı bir geçici çözüm, türler için null değerleri işleyen aşağıdaki örnek gibi tür için bir dönüştürücü hale getirme örneğidir DateTimeOffset :
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace SystemTextJsonSamples
{
public class DateTimeOffsetNullHandlingConverter : JsonConverter<DateTimeOffset>
{
public override DateTimeOffset Read(
ref Utf8JsonReader reader,
Type typeToConvert,
JsonSerializerOptions options) =>
reader.TokenType == JsonTokenType.Null
? default
: reader.GetDateTimeOffset();
public override void Write(
Utf8JsonWriter writer,
DateTimeOffset dateTimeValue,
JsonSerializerOptions options) =>
writer.WriteStringValue(dateTimeValue);
}
}
Bu özel dönüştürücüyü , özellik üzerindeki bir özniteliği kullanarak veya dönüştürücüyü koleksiyona ekleyerek kaydettirin Converters .
Note: Yukarıdaki dönüştürücü, Newtonsoft.Json varsayılan değerleri belirten Pocos için, null değerleri farklı işler. Örneğin, aşağıdaki kodun hedef nesneniz temsil ettiğini varsayalım:
public class WeatherForecastWithDefault
{
public WeatherForecastWithDefault()
{
Date = DateTimeOffset.Parse("2001-01-01");
Summary = "No summary";
}
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
}
Ve önceki dönüştürücüyü kullanarak aşağıdaki JSON 'nin seri durumdan çıkarıldığını varsayalım:
{
"Date": null,
"TemperatureCelsius": 25,
"Summary": null
}
Seri durumdan çıktıktan sonra, Date özelliği 1/1/0001 ( default(DateTimeOffset) ) değerini içerir, diğer bir deyişle, oluşturucuda ayarlanan değerin üzerine yazılır. Aynı POCO ve JSON olarak verildiğinde, Newtonsoft.Json seri durumdan çıkarma özelliğinde 1/1/2001 ' i bırakır Date .
Sabit sınıflar ve yapılar için seri durumdan çıkarma
Newtonsoft.Json parametreleri olan oluşturucuları kullanabilmesi için, sabit sınıflar ve yapılar için seri hale getirebilirsiniz.
İçinde System.Text.Json , parametreli bir oluşturucunun kullanımını belirtmek için [jsonconstructor] özniteliğini kullanın. C# 9 ' daki kayıtlar da sabittir ve seri durumundan çıkarma hedefi olarak desteklenir. Daha fazla bilgi için bkz. Sabit türler ve kayıtlar.
System.Text.Json .NET Core 3,1 ' de yalnızca ortak parametresiz oluşturucular desteklenir. Geçici bir çözüm olarak, özel bir dönüştürücüde parametreleri olan bir Oluşturucu çağırabilirsiniz.
İşte birden çok Oluşturucu parametresi olan değişmez bir struct:
public readonly struct ImmutablePoint
{
public ImmutablePoint(int x, int y)
{
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
}
İşte bu yapıyı seri hale getirir ve seri hale getirir:
using System;
using System.Diagnostics;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace SystemTextJsonSamples
{
public class ImmutablePointConverter : JsonConverter<ImmutablePoint>
{
private readonly JsonEncodedText _xName = JsonEncodedText.Encode("X");
private readonly JsonEncodedText _yName = JsonEncodedText.Encode("Y");
private readonly JsonConverter<int> _intConverter;
public ImmutablePointConverter(JsonSerializerOptions options) =>
_intConverter = options?.GetConverter(typeof(int)) is JsonConverter<int> intConverter
? intConverter
: throw new InvalidOperationException();
public override ImmutablePoint Read(
ref Utf8JsonReader reader,
Type typeToConvert,
JsonSerializerOptions options)
{
if (reader.TokenType != JsonTokenType.StartObject)
{
throw new JsonException();
};
int? x = default;
int? y = default;
// Get the first property.
reader.Read();
if (reader.TokenType != JsonTokenType.PropertyName)
{
throw new JsonException();
}
if (reader.ValueTextEquals(_xName.EncodedUtf8Bytes))
{
x = ReadProperty(ref reader, options);
}
else if (reader.ValueTextEquals(_yName.EncodedUtf8Bytes))
{
y = ReadProperty(ref reader, options);
}
else
{
throw new JsonException();
}
// Get the second property.
reader.Read();
if (reader.TokenType != JsonTokenType.PropertyName)
{
throw new JsonException();
}
if (x.HasValue && reader.ValueTextEquals(_yName.EncodedUtf8Bytes))
{
y = ReadProperty(ref reader, options);
}
else if (y.HasValue && reader.ValueTextEquals(_xName.EncodedUtf8Bytes))
{
x = ReadProperty(ref reader, options);
}
else
{
throw new JsonException();
}
reader.Read();
if (reader.TokenType != JsonTokenType.EndObject)
{
throw new JsonException();
}
return new ImmutablePoint(x.GetValueOrDefault(), y.GetValueOrDefault());
}
private int ReadProperty(ref Utf8JsonReader reader, JsonSerializerOptions options)
{
Debug.Assert(reader.TokenType == JsonTokenType.PropertyName);
reader.Read();
return _intConverter.Read(ref reader, typeof(int), options);
}
private void WriteProperty(Utf8JsonWriter writer, JsonEncodedText name, int intValue, JsonSerializerOptions options)
{
writer.WritePropertyName(name);
_intConverter.Write(writer, intValue, options);
}
public override void Write(
Utf8JsonWriter writer,
ImmutablePoint point,
JsonSerializerOptions options)
{
writer.WriteStartObject();
WriteProperty(writer, _xName, point.X, options);
WriteProperty(writer, _yName, point.Y, options);
writer.WriteEndObject();
}
}
}
Dönüştürücüyü koleksiyona ekleyerek bu özel dönüştürücüyü kaydedin Converters .
Açık genel özellikleri işleyen benzer dönüştürücünün bir örneği için bkz. anahtar-değer çiftleri için yerleşik dönüştürücü.
Gerekli özellikler
' De Newtonsoft.Json , özniteliği için bir özelliğin gerekli olduğunu belirtirsiniz Required [JsonProperty] . Newtonsoft.Json JSON içinde gerekli olarak işaretlenmiş bir özellik için hiçbir değer alınmadığında bir özel durum oluşturur.
System.Text.Json hedef türün özelliklerinden biri için hiçbir değer alınmazsa özel durum oluşturmaz. Örneğin, bir WeatherForecast sınıfınız varsa:
public class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
}
Aşağıdaki JSON, hata olmadan seri durumdan çıkarılacak:
{
"TemperatureCelsius": 25,
"Summary": "Hot"
}
JSON 'da hiçbir özellik yoksa seriyi kaldırma başarısız olması için Date aşağıdaki seçeneklerden birini belirleyin:
- Özel bir dönüştürücü uygulayın.
- Bir
OnDeserializedgeri çağırma uygulayın (.net 6 ve üzeri).
Aşağıdaki örnek dönüştürücü kodu, Date seri kaldırma tamamlandıktan sonra özellik ayarlanmamışsa bir özel durum oluşturur:
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace SystemTextJsonSamples
{
public class WeatherForecastRequiredPropertyConverter : JsonConverter<WeatherForecast>
{
public override WeatherForecast Read(
ref Utf8JsonReader reader,
Type type,
JsonSerializerOptions options)
{
// Don't pass in options when recursively calling Deserialize.
WeatherForecast forecast = JsonSerializer.Deserialize<WeatherForecast>(ref reader);
// Check for required fields set by values in JSON
return forecast.Date == default
? throw new JsonException("Required property not received in the JSON")
: forecast;
}
public override void Write(
Utf8JsonWriter writer,
WeatherForecast forecast, JsonSerializerOptions options)
{
// Don't pass in options when recursively calling Serialize.
JsonSerializer.Serialize(writer, forecast);
}
}
}
Dönüştürücüyü koleksiyona ekleyerek bu özel dönüştürücüyü kaydedin JsonSerializerOptions.Converters .
Dönüştürücüyü yinelemeli olarak çağırmanın bu deseninin JsonSerializerOptions bir özniteliği kullanarak değil kullanarak dönüştürücüyü kaydetmesi gerekir. Dönüştürücüyü bir özniteliği kullanarak kaydettiğinizde, özel dönüştürücü özyinelemeli olarak kendine çağırır. Sonuç, yığın taşması özel durumuyla biten sonsuz bir döngüdür.
Options nesnesini kullanarak dönüştürücüyü kaydettiğinizde, veya özyinelemeli bir döngüden, yinelemeli olarak veya çağrılırken Options nesnesine geçirilmeyen bir döngüden kaçının Serialize Deserialize . Options nesnesi Converters koleksiyonu içerir. Veya ' a geçirirseniz, Serialize Deserialize özel dönüştürücü kendi kendine çağrı yapar ve yığın taşması özel durumuna neden olan sonsuz bir döngü sağlar. Varsayılan seçenekler uygun değilse, gereken ayarlarla seçeneklerin yeni bir örneğini oluşturun. Her yeni örnek bağımsız olarak önbelleğe aldığından bu yaklaşım yavaş olur.
Dönüştürülecek sınıfta kayıt kullanılabilecek alternatif bir model vardır JsonConverterAttribute . Bu yaklaşımda dönüştürücü kodu, Serialize Deserialize dönüştürülecek sınıftan türeyen bir sınıfı çağırır. Türetilmiş sınıf JsonConverterAttribute kendisine uygulanmış değil. Aşağıdaki örnekte, bu alternatif aşağıda verilmiştir:
WeatherForecastWithRequiredPropertyConverterAttribute, seri durumdan çıkarılacak ve ona uygulanmış olan sınıftırJsonConverterAttribute.WeatherForecastWithoutRequiredPropertyConverterAttribute, Converter özniteliğine sahip olmayan türetilmiş sınıftır.- Dönüştürücüdeki kod,
SerializeDeserializeWeatherForecastWithoutRequiredPropertyConverterAttributesonsuz bir döngüden kaçınmak için ve öğesini çağırır. Ek bir nesne örneklemesi ve özellik değerlerinin kopyalanması nedeniyle serileştirme üzerinde bu yaklaşımın performans maliyeti vardır.
WeatherForecast*Türler şunlardır:
[JsonConverter(typeof(WeatherForecastRequiredPropertyConverterForAttributeRegistration))]
public class WeatherForecastWithRequiredPropertyConverterAttribute
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
}
public class WeatherForecastWithoutRequiredPropertyConverterAttribute :
WeatherForecastWithRequiredPropertyConverterAttribute
{
}
Dönüştürücü şöyledir:
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace SystemTextJsonSamples
{
public class WeatherForecastRequiredPropertyConverterForAttributeRegistration :
JsonConverter<WeatherForecastWithRequiredPropertyConverterAttribute>
{
public override WeatherForecastWithRequiredPropertyConverterAttribute Read(
ref Utf8JsonReader reader,
Type type,
JsonSerializerOptions options)
{
// OK to pass in options when recursively calling Deserialize.
WeatherForecastWithRequiredPropertyConverterAttribute forecast =
JsonSerializer.Deserialize<WeatherForecastWithoutRequiredPropertyConverterAttribute>(
ref reader,
options);
// Check for required fields set by values in JSON.
return forecast.Date == default
? throw new JsonException("Required property not received in the JSON")
: forecast;
}
public override void Write(
Utf8JsonWriter writer,
WeatherForecastWithRequiredPropertyConverterAttribute forecast,
JsonSerializerOptions options)
{
var weatherForecastWithoutConverterAttributeOnClass =
new WeatherForecastWithoutRequiredPropertyConverterAttribute
{
Date = forecast.Date,
TemperatureCelsius = forecast.TemperatureCelsius,
Summary = forecast.Summary
};
// OK to pass in options when recursively calling Serialize.
JsonSerializer.Serialize(
writer,
weatherForecastWithoutConverterAttributeOnClass,
options);
}
}
}
Gerekli özellikler Dönüştürücüsü, [Jsonıgnore] gibi öznitelikleri veya özel kodlayıcılar gibi farklı seçenekleri işlemeniz gerekiyorsa ek mantık gerektirir. Ayrıca, örnek kod, oluşturucuda varsayılan bir değer ayarlanan özellikleri işlemez. Bu yaklaşım aşağıdaki senaryolar arasında ayrım yapmaz:
- JSON 'da bir özellik eksik.
- Null atanamaz bir tür için bir özellik JSON içinde bulunur, ancak değer, türü için sıfır gibi varsayılan değerdir
int. - JSON 'da null olabilen bir değer türü özelliği var, ancak değer null.
Note: System.Text.Jsonbir ASP.NET Core denetleyicisinden kullanıyorsanız, bir [Required] dönüştürücüyü uygulamak yerine model sınıfının özelliklerinde bir özniteliği kullanabilirsiniz System.Text.Json .
Tarih biçimini belirtin
Newtonsoft.Json , DateTime ve DateTimeOffset türlerinin özelliklerinin serileştirilme ve seri durumdan çıkarılme biçimini denetlemek için çeşitli yollar sağlar:
DateTimeZoneHandlingAyar, tümDateTimedeğerleri UTC tarihleri olarak seri hale getirmek için kullanılabilir.DateFormatStringAyar veDateTimedönüştürücüler, tarih dizelerinin biçimini özelleştirmek için kullanılabilir.
System.Text.Json , RFC 3339 profili de dahil olmak üzere ISO 8601-1:2019 ' u destekler. Bu biçim yaygın olarak benimsenmiştir, net bir şekilde gerçekleştirilir ve gidiş dönüşlerin kesin bir şekilde Başka bir biçim kullanmak için özel bir dönüştürücü oluşturun. Örneğin, aşağıdaki dönüştürücüler, saat dilimi farkına sahip veya olmadan UNIX dönemi biçimi kullanan JSON serisini serileştirme ve seri durumdan çıkarma (veya gibi değerler /Date(1590863400000-0700)/ /Date(1590863400000)/ ):
sealed class UnixEpochDateTimeOffsetConverter : JsonConverter<DateTimeOffset>
{
static readonly DateTimeOffset s_epoch = new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero);
static readonly Regex s_regex = new Regex("^/Date\\(([+-]*\\d+)([+-])(\\d{2})(\\d{2})\\)/$", RegexOptions.CultureInvariant);
public override DateTimeOffset Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
string formatted = reader.GetString();
Match match = s_regex.Match(formatted);
if (
!match.Success
|| !long.TryParse(match.Groups[1].Value, System.Globalization.NumberStyles.Integer, CultureInfo.InvariantCulture, out long unixTime)
|| !int.TryParse(match.Groups[3].Value, System.Globalization.NumberStyles.Integer, CultureInfo.InvariantCulture, out int hours)
|| !int.TryParse(match.Groups[4].Value, System.Globalization.NumberStyles.Integer, CultureInfo.InvariantCulture, out int minutes))
{
throw new JsonException();
}
int sign = match.Groups[2].Value[0] == '+' ? 1 : -1;
TimeSpan utcOffset = new TimeSpan(hours * sign, minutes * sign, 0);
return s_epoch.AddMilliseconds(unixTime).ToOffset(utcOffset);
}
public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSerializerOptions options)
{
long unixTime = Convert.ToInt64((value - s_epoch).TotalMilliseconds);
TimeSpan utcOffset = value.Offset;
string formatted = FormattableString.Invariant($"/Date({unixTime}{(utcOffset >= TimeSpan.Zero ? "+" : "-")}{utcOffset:hhmm})/");
writer.WriteStringValue(formatted);
}
}
sealed class UnixEpochDateTimeConverter : JsonConverter<DateTime>
{
static readonly DateTime s_epoch = new DateTime(1970, 1, 1, 0, 0, 0);
static readonly Regex s_regex = new Regex("^/Date\\(([+-]*\\d+)\\)/$", RegexOptions.CultureInvariant);
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
string formatted = reader.GetString();
Match match = s_regex.Match(formatted);
if (
!match.Success
|| !long.TryParse(match.Groups[1].Value, System.Globalization.NumberStyles.Integer, CultureInfo.InvariantCulture, out long unixTime))
{
throw new JsonException();
}
return s_epoch.AddMilliseconds(unixTime);
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
long unixTime = Convert.ToInt64((value - s_epoch).TotalMilliseconds);
string formatted = FormattableString.Invariant($"/Date({unixTime})/");
writer.WriteStringValue(formatted);
}
}
Daha fazla bilgi için, bkz. ' de System.Text.Json DateTime ve DateTimeOffset desteği .
Geri Çağırmalar
Newtonsoft.Json serileştirme veya seri kaldırma işleminde özel kodu birkaç noktada yürütmenize imkan tanır:
- Onserisini kaldırma (bir nesnenin serisini kaldırmada başlayan)
- Onseri durumdan çıkarılan (bir nesnenin serisini kaldırma tamamlandığında)
- Onserileştirilme (bir nesne seri hale getirilmeye Başlarken)
- Onserileştirilmiş (bir nesne serileştirildiğinde)
System.Text.Json serileştirme ve seri durumundan çıkarma sırasında aynı bildirimleri gösterir. Bunları kullanmak için, aşağıdaki arabirimlerden bir veya daha fazlasını ad alanından uygulayın System.Text.Json.Serialization :
İşte, seri hale getirme ve seri durumundan çıkarma sırasında, null bir özelliği denetleyen ve ileti yazan bir örnek:
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Callbacks
{
public class WeatherForecast :
IJsonOnDeserializing, IJsonOnDeserialized,
IJsonOnSerializing, IJsonOnSerialized
{
public DateTime Date { get; set; }
public int TemperatureCelsius { get; set; }
public string? Summary { get; set; }
void IJsonOnDeserializing.OnDeserializing() => Console.WriteLine("\nBegin deserializing");
void IJsonOnDeserialized.OnDeserialized()
{
Validate();
Console.WriteLine("Finished deserializing");
}
void IJsonOnSerializing.OnSerializing()
{
Console.WriteLine("Begin serializing");
Validate();
}
void IJsonOnSerialized.OnSerialized() => Console.WriteLine("Finished serializing");
private void Validate()
{
if (Summary is null)
{
Console.WriteLine("The 'Summary' property is 'null'.");
}
}
}
public class Program
{
public static void Main()
{
var weatherForecast = new WeatherForecast
{
Date = DateTime.Parse("2019-08-01"),
TemperatureCelsius = 25,
};
string jsonString = JsonSerializer.Serialize(weatherForecast);
Console.WriteLine(jsonString);
weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(jsonString);
Console.WriteLine($"Date={weatherForecast?.Date}");
Console.WriteLine($"TemperatureCelsius={weatherForecast?.TemperatureCelsius}");
Console.WriteLine($"Summary={weatherForecast?.Summary}");
}
}
}
// output:
//Begin serializing
//The 'Summary' property is 'null'.
//Finished serializing
//{"Date":"2019-08-01T00:00:00","TemperatureCelsius":25,"Summary":null}
//Begin deserializing
//The 'Summary' property is 'null'.
//Finished deserializing
//Date=8/1/2019 12:00:00 AM
//TemperatureCelsius = 25
//Summary=
OnDeserializingKodun yenı POCO örneğine erişimi yok. Yeni POCO örneğini serisini kaldırma başlangıcında işlemek için, bu kodu POCO yapıcısına koyun.
System.Text.Json' De, özel bir dönüştürücü yazarak geri çağırmaların benzetimini yapabilirsiniz. Aşağıdaki örnek bir POCO için özel dönüştürücüyü gösterir. Dönüştürücü, bir geri aramaya karşılık gelen her bir noktada bir ileti görüntüleyen kodu içerir Newtonsoft.Json .
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace SystemTextJsonSamples
{
public class WeatherForecastCallbacksConverter : JsonConverter<WeatherForecast>
{
public override WeatherForecast Read(
ref Utf8JsonReader reader,
Type type,
JsonSerializerOptions options)
{
// Place "before" code here (OnDeserializing),
// but note that there is no access here to the POCO instance.
Console.WriteLine("OnDeserializing");
// Don't pass in options when recursively calling Deserialize.
WeatherForecast forecast = JsonSerializer.Deserialize<WeatherForecast>(ref reader);
// Place "after" code here (OnDeserialized)
Console.WriteLine("OnDeserialized");
return forecast;
}
public override void Write(
Utf8JsonWriter writer,
WeatherForecast forecast, JsonSerializerOptions options)
{
// Place "before" code here (OnSerializing)
Console.WriteLine("OnSerializing");
// Don't pass in options when recursively calling Serialize.
JsonSerializer.Serialize(writer, forecast);
// Place "after" code here (OnSerialized)
Console.WriteLine("OnSerialized");
}
}
}
Dönüştürücüyü koleksiyona ekleyerek bu özel dönüştürücüyü kaydedin Converters .
Önceki örneği takip eden özel bir dönüştürücü kullanıyorsanız:
OnDeserializingKodun yenı POCO örneğine erişimi yok. Yeni POCO örneğini serisini kaldırma başlangıcında işlemek için, bu kodu POCO yapıcısına koyun.- Özyinelemeli bir döngüden kaçınarak, Seçenekler nesnesine dönüştürücüyü kaydederek ve yinelemeli olarak ya da çağrılırken Options nesnesine geçirmekten kaçının
SerializeDeserialize.
Yinelemeli olarak çağıran özel dönüştürücüler hakkında daha fazla bilgi Serialize için Deserialize , bu makalenin önceki kısımlarında yer alan gerekli özellikler bölümüne bakın.
Genel olmayan özellik ayarlayıcıları ve alıcılar
Newtonsoft.Json özniteliği aracılığıyla özel ve iç özellik ayarlayıcıları ve alıcıları öğeleri kullanılabilir JsonProperty .
System.Text.Json , [Jsonınclude] özniteliği aracılığıyla özel ve iç özellik ayarlayıcıları ve geticileri destekler. Örnek kod için bkz. genel olmayan özellik erişimcileri.
System.Text.Json .NET Core 3,1 ' de yalnızca genel ayarlayıcıları desteklenir. Özel dönüştürücüler, bu işlevselliği sağlayabilir.
Mevcut nesneleri doldur
JsonConvert.PopulateObjectİçindeki yöntemi, BIR Newtonsoft.Json JSON belgesini, yeni bir örnek oluşturmak yerine, bir sınıfın varolan bir örneğine kaldırma. System.Text.Json her zaman varsayılan genel parametresiz oluşturucuyu kullanarak hedef türün yeni bir örneğini oluşturur. Özel dönüştürücüler, var olan bir örneğe serisini kaldıramıyor.
Özellikleri değiştirmek yerine yeniden kullan
Newtonsoft.Json ObjectCreationHandling Ayar, özellikleri içindeki nesnelerin seri durumundan çıkarma sırasında yerine kullanılması gerektiğini belirtmenize olanak tanır. System.Text.Json her zaman özelliklerde nesneleri değiştirir. Özel dönüştürücüler, bu işlevselliği sağlayabilir.
Ayarlayıcısız koleksiyonlara Ekle
Seri durumundan çıkarma sırasında, Newtonsoft.Json özelliğin ayarlayıcısı olmasa bile nesneleri bir koleksiyona ekler. System.Text.Json ayarlayıcıları olmayan özellikleri yoksayar. Özel dönüştürücüler, bu işlevselliği sağlayabilir.
Snake olay adlandırma ilkesi
' Deki tek yerleşik özellik adlandırma ilkesi System.Text.Json , ortası büyük/küçük harfeyöneliktir. Newtonsoft.Json , özellik adlarını Snake durumuna dönüştürebilir. Özel bir adlandırma ilkesi , bu işlevselliği sağlayabilir. daha fazla bilgi için bkz. GitHub sorunu dotnet/çalışma zamanı #782.
System. Runtime. Serialization öznitelikleri
System.Text.JsonSystem.Runtime.Serialization, ve gibi ad alanındaki öznitelikleri desteklemez DataMemberAttribute IgnoreDataMemberAttribute .
Sekizlik sayılar
Newtonsoft.Json sayıları, sekizli sayı olarak önünde sıfır ile değerlendirir. System.Text.JsonRFC 8259 belirtimi bunlara izin vermediğinden önde gelen sıfıra izin vermez.
MissingMemberHandling
Newtonsoft.Json JSON, hedef türde eksik olan özellikleri içerirse, özel durumları deserialization sırasında atacak şekilde yalıtabilirsiniz. System.Text.Json[JsonExtensionData]özniteliğini kullanma dışında JSON'daki ek özellikleri yoksayar. Eksik üye özelliği için geçici bir çözüm yoktur.
TraceWriter
Newtonsoft.Json , serileştirme veya seriyi kaldırarak oluşturulan günlükleri görüntülemek için kullanarak hata TraceWriter ayıklamaya olanak sağlar. System.Text.Json günlüğe kaydetmez.
JsonDocument ve JsonElement ile JToken karşılaştırması (JObject, JArray gibi)
System.Text.Json.JsonDocument , mevcut JSON yüklerinden salt okunur bir Belge Nesne Modeli (DOM) ayrıştırma ve oluşturma olanağı sağlar. DOM, JSON yükünde verilere rastgele erişim sağlar. Yükü oluşturan JSON öğelerine türü aracılığıyla JsonElement erişilebilir. türü, JsonElement JSON metnini ortak .NET türlerine dönüştürmek için API'ler sağlar. JsonDocument bir özelliği RootElement ortaya çıkarır.
.NET 6'dan başlayarak, ad alanı türünü ve diğer türleri kullanarak var olan JSON yüklerinden tarifeli bir DOM ayrıştırarak JsonNode ve System.Text.Json.Nodes oluşturabilirsiniz. Daha fazla bilgi için bkz. Kullanma. JsonNode
JsonDocument is IDisposable
JsonDocument verilerin bellek içinde bir görünümünü havuza alındı arabelleğe derleme. Bu nedenle, JObject JArray veya Newtonsoft.Json türünden farklı olarak türü uygulanır JsonDocument ve bir using bloğu içinde IDisposable kullanılmalıdır. Daha fazla bilgi için bkz. JsonDocument is IDisposable.
JsonDocument salt okunur
System.Text.JsonDOM, JSON öğelerini ekser, kaldır veya değiştiremez. Performans için ve yaygın JSON yük boyutlarını (1 MB veya daha fazla) ayrıştırmak için ayırmaları azaltmak üzere bu < tasarlanmıştır.
Senaryonda şu anda değiştirilebilir bir DOM kullanıyorsanız, aşağıdaki geçici çözümlerden biri uygulanabilir olabilir:
- Sıfırdan bir derlemek için (başka bir ifadeyle yöntemine mevcut bir JSON yükü geçirmeden), kullanarak JSON metnini yazın ve yeni bir yapmak için bunun çıkışını
JsonDocumentParseUtf8JsonWriterJsonDocumentayrıştırarak. - Mevcut bir 'yi değiştirmek için JSON metni yazmak, siz yazma sırasında değişiklik yapmak ve bunun çıktısını
JsonDocumentayrıştırarak yeni birJsonDocumentyapın. - veya API'leri ile eşdeğer olan mevcut JSON belgelerini 'den birleştirmek
JObject.MergeJContainer.Mergeiçin bu GitHubNewtonsoft.Jsonbakın.
Bu geçici çözümler yalnızca System.Text.Json 6.0'dan önceki sürümler için gereklidir. 6.0'da JsonNode'u kullanarak tarifeli dom ile çalış.
JsonElement bir union yapıdır
JsonDocument öğesini, RootElement herhangi bir JSON öğesini JsonElement kapsayan bir union yapı türü olan türünün bir özelliği olarak ortaya çıkarır. Newtonsoft.Json , , vb. gibi JObject ayrılmış JArray JToken hiyerarşik türleri kullanır. JsonElement , üzerinde arama ve numaralama yapmak için kullanabileceğiniz öğedir ve JSON öğelerini JsonElement .NET türlerine göre yapmak için kullanabilirsiniz.
.NET 6'dan başlayarak, , ve ad JsonNode alanına karşılık gelen tür ve türleri System.Text.Json.Nodes JObject JArray JToken kullanabilirsiniz. Daha fazla bilgi için bkz. Kullanma. JsonNode
JsonDocument ve JsonElement'i alt öğeler için arama
veya kullanan JSON belirteçleri için yapılan aramalar, bazı sözlüklerde aramalar JObject JArray olduğundan Newtonsoft.Json görece hızlıdır. Buna karşılık, üzerinde yapılan aramalar, özellikler için sıralı arama gerektirir ve bu nedenle JsonElement görece yavaştır (örneğin TryGetProperty kullanırken). System.Text.Json arama süresi yerine ilk ayrıştırma süresini en aza indirmek için tasarlanmıştır. Daha fazla bilgi için bkz. JsonDocument ve JsonElement'de alt öğeleri arama.
Utf8JsonReader ile JsonTextReader karşılaştırması
System.Text.Json.Utf8JsonReader, bir ReadOnlySpan <byte> veya <byte> ReadOnlySequence'danokunan, UTF-8 ile kodlanmış JSON metni için yüksek performanslı, düşük ayırmalı, yalnızca ileri doğru okuyucudur. Utf8JsonReader, özel ayrıştırıcılar ve deserializer'lar oluşturmak için kullanılan düşük düzeyli bir t t'tir.
Utf8JsonReader bir başvuru yapıdır
JsonTextReaderiçinde Newtonsoft.Json bir sınıfıdır. Utf8JsonReadertürü, başvuru yapılarının türünden farklıdır. Daha fazla bilgi için bkz. Utf8JsonReader bir başvuru yapıdır.
Null değerleri null değer türlerine okuma
Newtonsoft.Json , gibi döndüren Nullable<T> API'ler ReadAsBoolean sağlar; bu da bir Null TokenType döndürerek sizin için bir bool? işler. Yerleşik System.Text.Json API'ler yalnızca null değere sahip olmayan değer türlerini döndürür. Daha fazla bilgi için bkz. Null değerleri null değer türlerine okuma.
Çoklu hedefleme
Belirli hedef çerçeveler için kullanmaya Newtonsoft.Json devam etmek gerekirse, birden çok hedef kullanabilir ve iki uygulamaya sahip olursanız. Ancak, bu önemsiz değildir ve bazı ve kaynak #ifdefs yinelemeleri gerektirir. Mümkün olduğunca çok kod paylaşmanın bir yolu, ve çevresinde ref struct bir sarmalayıcı Utf8JsonReader Newtonsoft.Json JsonTextReader oluşturmaktır. Bu sarmalayıcı, davranış farklılıklarını yalıtırken genel yüzey alanı birletir. Bu, değişiklikleri temel olarak türün yapısında yalıtmanın yanı sıra yeni türü başvuruya göre geçirmenizi sağlar. Microsoft.Extensions.DependencyModel kitaplığının şu desene sahip olması gerekir:
Utf8JsonWriter ile JsonTextWriter karşılaştırması
System.Text.Json.Utf8JsonWriter, ve gibi yaygın .NET türlerinden UTF-8 ile kodlanmış JSON metni yazmanın yüksek String performanslı Int32 bir yolu. DateTime Yazıcı, özel seri hale getiriciler oluşturmak için kullanılan düşük düzeyli bir türtür.
Ham değerler yazma
yöntemi, Newtonsoft.Json WriteRawValue bir değerin beklendiği yerde ham JSON yazar. System.Text.Json doğrudan eşdeğeri: Utf8JsonWriter.WriteRawValue . Daha fazla bilgi için bkz. Ham JSON yazma.
yöntemi, Newtonsoft.Json WriteRawValue bir değerin beklendiği yerde ham JSON yazar. Utf8JsonWriter.WriteRawValue.NET 6'da eşdeğer bir yöntemi vardır. Daha fazla bilgi için bkz. Ham JSON yazma.
6.0'dan önceki sürümlerde ham System.Text.Json JSON yazmak için eşdeğer bir yöntem yoktur. Ancak, aşağıdaki geçici çözüm yalnızca geçerli JSON'un yazıldığına emin olur:
using JsonDocument doc = JsonDocument.Parse(string);
doc.WriteTo(writer);
JSON biçimini özelleştirme
JsonTextWriter aşağıdaki ayarları içerir ve bunun Utf8JsonWriter eşdeğeri yoktur:
- Girintileme - Girintileme için kaç karakter olduğunu belirtir.
Utf8JsonWriterher zaman 2 karakterli girintileme yapar. - IndentChar - Girintileme için kullanmak üzere karakteri belirtir.
Utf8JsonWriterher zaman boşluk kullanır. - QuoteChar - Dize değerlerini çevrelerken kullanmak üzere karakteri belirtir.
Utf8JsonWriterher zaman çift tırnak kullanır. - QuoteName - Özellik adlarının tırnak içine alınıp alınıp alınıp alınamay olmadığını belirtir.
Utf8JsonWriterher zaman tırnak içine alınarak çevreler.
tarafından üretilen JSON'u bu yollarla özelleştirmenize izin verebileceğiniz geçici Utf8JsonWriter çözümler yoktur.
Zamanpan, Uri veya karakter değerleri yazma
JsonTextWriter``WriteValue TimeSpan, Urive char değerleri için yöntemler sağlar. Utf8JsonWriter eşdeğer yöntemleri yoktur. Bunun yerine, bu değerleri dize olarak biçimlendirin ToString() (örneğin, çağırarak) ve çağrısı. WriteStringValue
Çoklu hedefleme
Belirli hedef çerçeveler için kullanmaya Newtonsoft.Json devam etmek gerekirse, birden çok hedef kullanabilir ve iki uygulamaya sahip olursanız. Ancak, bu önemsiz değildir ve bazı ve kaynak #ifdefs yinelemeleri gerektirir. Mümkün olduğunca çok kod paylaşmanın bir yolu, ve çevresinde bir sarmalayıcı Utf8JsonWriter Newtonsoft JsonTextWriter oluşturmaktır. Bu sarmalayıcı, davranış farklılıklarını yalıtırken genel yüzey alanı birletir. Bu, değişiklikleri temel olarak türün yapısıyla yalıtmamanizi sağlar. Microsoft.Extensions.DependencyModel kitaplığı aşağıdaki gibidir:
TypeNameHandling.All desteklenmiyor
Eşdeğer işlevselliğin TypeNameHandling.All dışlama kararı System.Text.Json kasıtlıydı. Bir JSON yükünün kendi tür bilgilerini belirtmesini sağlarken, web uygulamalarında yaygın olarak karşılaşılan güvenlik açıkları kaynağıdır. Özellikle ile yapılandırmak, uzak istemcinin JSON yükünün içine yürütülebilir bir uygulamanın tamamını eklemesini sağlar; böylece, web uygulaması, katıştırılmış kodu ayıklar ve Newtonsoft.Json TypeNameHandling.All çalıştırır. Daha fazla bilgi için bkz. 13. JSON saldırıları PowerPoint Cuma, 13. JSON saldırıları ayrıntıları.
JSON Yolu sorguları desteklenmiyor
JsonDocumentDOM, JSON Yolu kullanarak sorgulamayı desteklemez.
JsonNodeDoM'da her JsonNode örnek, bu GetPath düğümün yolunu döndüren bir yönteme sahip olur. Ancak JSON Yolu sorgu dizelerini temel alan sorguları işlemek için yerleşik API yoktur.
Daha fazla bilgi için dotnet/runtime #31068 GitHub bakın.
Bazı sınırlar yapılandırılabilir değil
System.Text.Json bazı değerler için değiştirilene limitler ayarlar, örneğin karakter olarak en büyük belirteç boyutu (166 MB) ve temel 64 (125 MB). Daha fazla bilgi için JsonConstants bkz. kaynak kodunda ve GitHub dotnet/runtime #39953.
NaN, Infinity, -Infinity
Newtonsoft, NaN , Infinity ve -Infinity JSON dize belirteçlerini ayrıştırıyor. .NET Core 3.1'de bu belirteçleri desteklemez, ancak bunları işlemek için System.Text.Json özel bir dönüştürücü yazabilir. .NET 5 ve sonraki sürümlerinde JsonNumberHandling.AllowNamedFloatingPointLiterals kullanın. Bu ayarı kullanma hakkında bilgi için bkz. Tırnak içinde sayılara izin verme veya yazma.
Ek kaynaklar
- System.Text.Json Genel bakış
- JSON’u seri hale getirme ve seri halden çıkarma
- 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
- 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