Geçiş:Newtonsoft.JsonSystem.Text.Json
Bu makalede'den Newtonsoft.Json 'e System.Text.Jsonnasıl geçiş yapılacağını gösterir.
Ad alanı, System.Text.Json
JavaScript Nesne Gösterimi'ne (JSON) serileştirme ve seri durumdan çıkarma işlevleri sağlar. Kitaplık System.Text.Json
, .NET Core 3.1 ve sonraki sürümleri için çalışma zamanına dahil edilir. Diğer hedef çerçeveler için NuGet paketini yükleyin System.Text.Json . Paket aşağıdakileri destekler:
- .NET Standard 2.0 ve sonraki sürümleri
- .NET Framework 4.6.2 ve sonraki sürümleri
- .NET Core 2.0, 2.1 ve 2.2
İpucu
GitHub Copilot ile geçiş Newtonsoft.Json
yapmak için yapay zeka yardımını kullanabilirsiniz.
System.Text.Json
öncelikle performans, güvenlik ve standartların uyumluluğuna odaklanır. Varsayılan davranışta bazı önemli farklılıklara sahiptir ve ile Newtonsoft.Json
özellik eşliğine sahip olmayı hedeflemez. Bazı senaryolarda şu System.Text.Json
anda yerleşik işlevsellik yoktur, ancak önerilen geçici çözümler vardır. Diğer senaryolarda geçici çözümler pratik değildir.
Ekip System.Text.Json
, en sık istenen özellikleri eklemeye yatırım yapıyor. Uygulamanız eksik bir özelliğe bağlıysa, senaryonuza yönelik desteğin eklenip eklenmediğini öğrenmek için dotnet/runtime GitHub deposunda bir sorun bildirin.
Bu makalenin çoğu API'nin nasıl kullanılacağıyla JsonSerializer ilgili olmakla birlikte , (Belge Nesne Modeli'ni veya DOM'yi temsil eder) Utf8JsonReaderve Utf8JsonWriter türlerini kullanma JsonDocument yönergelerini de içerir.
Visual Basic'te kullanamazsınız Utf8JsonReader, bu da özel dönüştürücüler yazabileceğiniz 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.
Farklılıklar tablosu
Aşağıdaki tabloda özellikler ve System.Text.Json
eşdeğerler listelenmiştirNewtonsoft.Json
. Eşdeğerler aşağıdaki kategorilere ayrılır:
- ✔️ Yerleşik işlevsellik tarafından desteklenir. 'den
System.Text.Json
benzer davranışlar almak için bir özniteliğin veya genel seçeneğin kullanılması gerekebilir. - ⚠️ Desteklenmez, ancak geçici çözüm mümkündür. Geçici çözümler, işlevsellikle
Newtonsoft.Json
tam eşlik sağlayabilen özel dönüştürücülerdir. Bunlardan bazıları için örnek kod örnek olarak sağlanır. BuNewtonsoft.Json
özelliklere güveniyorsanız, geçiş için .NET nesne modellerinizde veya diğer kod değişikliklerinizde değişiklik yapılması gerekir. - ❌ Desteklenmez ve geçici çözüm pratik veya mümkün değildir. Bu
Newtonsoft.Json
özelliklere güveniyorsanız, önemli değişiklikler olmadan geçiş mümkün olmayacaktır.
Newtonsoft.Json özelliği | System.Text.Json eşdeğer |
---|---|
Varsayılan olarak büyük/küçük harfe duyarlı olmayan seri durumdan çıkarma | ✔️ PropertyNameCaseInsensitive genel ayarı |
Camel-case özellik adları | ✔️ PropertyNamingPolicy genel ayarı |
Snake-case özellik adları | ✔️ Yılan olayı adlandırma ilkesi |
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üllere izin ver | ✔️ AllowTrailingCommas genel ayarı |
Özel dönüştürücü kaydı | ✔️ Öncelik sırası farklıdır |
Varsayılan maksimum derinlik 64, yapılandırılabilir | ✔️ Varsayılan maksimum derinlik 64, yapılandırılabilir |
PreserveReferencesHandling genel ayar |
✔️ ReferenceHandling genel ayarı |
Tırnak içindeki sayıları seri hale getirme veya seri durumdan çıkarma | ✔️ 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 | ✔️ IncludeFields genel ayarı, [JsonInclude] özniteliği |
DefaultValueHandling genel ayar |
✔️ DefaultIgnoreCondition genel ayarı |
NullValueHandling ayarı açık [JsonProperty] |
✔️ JsonIgnore özniteliği |
DefaultValueHandling ayarı açık [JsonProperty] |
✔️ JsonIgnore özniteliği |
Dize olmayan anahtarla seri durumdan çıkarma Dictionary |
✔️ Destekli |
Ortak olmayan özellik ayarlayıcıları ve alıcıları için destek | ✔️ JsonInclude özniteliği |
[JsonConstructor] özniteliği |
✔️ [JsonConstructor] özniteliği |
ReferenceLoopHandling genel ayar |
✔️ ReferenceHandling genel ayarı |
Geri Çağırmalar | ✔️ Geri |
NaN, Infinity, -Infinity | ✔️ Destekli |
Required özniteliğinde [JsonProperty] ayarı |
✔️ [JsonRequired] özniteliği ve C# gerekli değiştirici |
DefaultContractResolver özellikleri yoksaymak için |
✔️ DefaultJsonTypeInfoResolver sınıfı |
Polimorfik serileştirme | ✔️ [JsonDerivedType] özniteliği |
Polimorfik seri durumdan çıkarma | ✔️ [JsonDerivedType] özniteliğinde tür ayırıcısı |
Dize sabit listesi değerini seri durumdan çıkarma | ✔️ Dize sabit listesi değerlerini seri durumdan çıkarma |
MissingMemberHandling genel ayar |
✔️ Eksik üyeleri işleme |
Özellikleri ayarlayıcılar olmadan doldurma | ✔️ Özellikleri ayarlayıcılar olmadan doldurma |
ObjectCreationHandling genel ayar |
✔️ Özellikleri değiştirmek yerine yeniden kullanma |
Çok çeşitli türler için destek | ⚠️ Bazı türler özel dönüştürücüler gerektirir |
Çıkarsanan türü özelliklere seri durumdan çıkarma object |
⚠️ Desteklenmez, geçici çözüm, örnek |
JSON null değişmez değerini null atanamayan değer türlerine seri durumdan çıkarma |
⚠️ Desteklenmez, geçici çözüm, örnek |
DateTimeZoneHandling , DateFormatString ayarlar |
⚠️ Desteklenmez, geçici çözüm, örnek |
JsonConvert.PopulateObject yöntem |
⚠️ Desteklenmez, geçici çözüm |
System.Runtime.Serialization Öznitelik desteği |
⚠️ Desteklenmez, geçici çözüm, örnek |
JsonObjectAttribute |
⚠️ Desteklenmez, geçici çözüm |
Tırnak işaretleri olmadan özellik adlarına izin ver | ❌Tasarım tarafından desteklenmez |
Dize değerleri çevresinde tek tırnak işaretine izin ver | ❌Tasarım tarafından desteklenmez |
Dize özellikleri için dize olmayan JSON değerlerine izin ver | ❌Tasarım tarafından desteklenmez |
TypeNameHandling.All genel ayar |
❌Tasarım tarafından desteklenmez |
Sorgu desteği JsonPath |
❌Desteklenmiyor |
Yapılandırılabilir sınırlar | ❌Desteklenmiyor |
Bu, kapsamlı bir özellik listesi Newtonsoft.Json
değildir. Liste, GitHub sorunlarında veya StackOverflow gönderilerinde istenen senaryoların çoğunu içerir. Burada listelenen ve şu anda örnek kodu olmayan senaryolardan biri için geçici bir çö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 sayfa'yı seçin. Bu, bu belgenin GitHub deposunda bir sorun oluşturur ve bu sorunu bu sayfadaki Geri Bildirim bölümünde de listeler.
Varsayılan davranış farklılıkları
System.Text.Json varsayılan olarak katıdır ve arayan adına herhangi bir tahmin veya yorum yapmaktan kaçınarak belirleyici davranışı vurgular. Kitaplık, performans ve güvenlik için kasıtlı olarak bu şekilde tasarlanmıştır. Newtonsoft.Json
varsayılan olarak esnektir. Tasarımdaki bu temel fark, varsayılan davranışta aşağıdaki belirli farklılıkların birçoğunun arkasındadır.
Büyük/küçük harfe duyarlı olmayan seri durumdan çıkarma
Seri durumdan çıkarma sırasında, Newtonsoft.Json
varsayılan olarak büyük/küçük harfe duyarsız özellik adı eşleştirmesi yapar. Varsayılan System.Text.Json değer büyük/küçük harfe duyarlıdır ve tam eşleşme gerçekleştirdiğinden daha iyi performans sağlar. Büyük/küçük harfe duyarsız eşleştirme yapma hakkında 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 System.Text.Json
, gibi Newtonsoft.Json
bir davranış elde etmek için hiçbir şey yapmanız gerekmez. ASP.NET Core, kullandığında System.Text.Json
camel-casing özellik adları ve büyük/küçük harfe duyarsız eşleştirme ayarlarını belirtir.
ASP.NET Core, tırnak içine alınan sayıların varsayılan olarak seri durumdan çıkarılmasına da olanak tanır.
En az karakter kaçışı
Serileştirme sırasında, Newtonsoft.Json
karakterlerin onlardan kaçmadan geçmesine izin verme konusunda nispeten izin verilir. Yani, karakterlerin kod noktasının nerede xxxx
olduğuyla \uxxxx
değiştirmez. Onlardan kaçtığı yerde, karakterden önce bir \
yayarak bunu yapar (örneğin, "
olur \"
). System.Text.Json , siteler arası betik (XSS) veya bilgilerin açığa çıkması saldırılarına karşı derinlemesine koruma sağlamak için varsayılan olarak daha fazla karakterden kaçar ve bunu altı karakterlik diziyi kullanarak yapar. System.Text.Json
varsayılan olarak ASCII olmayan tüm karakterlerden kaçar, bu nedenle içinde Newtonsoft.Json
kullanıyorsanız StringEscapeHandling.EscapeNonAscii
hiçbir şey yapmanıza gerek yoktur. System.Text.Json
ayrıca varsayılan olarak HTML'ye duyarlı karakterlerden de kurtulur. Varsayılan System.Text.Json
davranışı geçersiz kılma hakkında bilgi için bkz . Karakter kodlamasını özelleştirme.
Açıklamalar
Seri durumdan çıkarma sırasında JSON'daki Newtonsoft.Json
açıklamaları varsayılan olarak yoksayar. System.Text.Json RFC 8259 belirtimi bunları içermediğinden, varsayılan olarak açıklamalar için özel durumlar oluşturulur. Açıklamalara izin verme hakkında bilgi için bkz . Açıklamalara ve sondaki virgüllere izin verme.
Sondaki virgüller
Seri durumdan çıkarma sırasında, Newtonsoft.Json
sondaki virgülleri varsayılan olarak yoksayar. Ayrıca birden çok sondaki virgülleri (örneğin, [{"Color":"Red"},{"Color":"Green"},,]
) yoksayar. System.Text.Json RFC 8259 belirtimi bunlara izin vermediğinden varsayılan olarak sondaki virgüller için özel durumlar oluşturulur. Bunları kabul etme System.Text.Json
hakkında bilgi için bkz . Açıklamalara ve sondaki virgüllere izin verme. Birden çok sondaki virgüle izin vermenin bir yolu yoktur.
Dönüştürücü kaydı önceliği
Newtonsoft.Json
Özel dönüştürücüler için kayıt önceliği aşağıdaki gibidir:
- Özellikte öznitelik
- Türdeki öznitelik
- Dönüştürücüler koleksiyonu
Bu sıra, koleksiyondaki özel dönüştürücülerin Converters
tür düzeyinde bir öznitelik uygulanarak kaydedilen bir dönüştürücü tarafından geçersiz kılındığı anlamına gelir. Bu kayıtların her ikisi de özellik düzeyindeki bir öznitelik tarafından geçersiz kılınıyor.
System.Text.Json Özel dönüştürücüler için kayıt önceliği farklıdır:
- Özellikte öznitelik
- Converters koleksiyon
- Türdeki öznitelik
Buradaki fark, koleksiyondaki özel dönüştürücülerin Converters
tür düzeyinde bir özniteliği geçersiz kılmalarıdır. Bu öncelik sırasının ardındaki amaç, çalışma zamanı değişikliklerini tasarım zamanı seçimlerini geçersiz kılmaktır. Önceliği değiştirmenin hiç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.
Maksimum derinlik
en son sürümü Newtonsoft.Json
varsayılan olarak en fazla 64 derinlik sınırına sahiptir. System.Text.Json ayrıca varsayılan sınırı 64'tür ve ayarıyla JsonSerializerOptions.MaxDepthyapılandırılabilir.
ASP.NET Core kullanarak dolaylı olarak kullanıyorsanız System.Text.Json
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)
Seri durumdan çıkarma sırasında, Newtonsoft.Json
çift tırnak içine, tek tırnak işaretiyle veya tırnak işareti olmadan özellik adlarını kabul eder. Çift tırnak veya tek tırnak içinde dize değerlerini kabul eder. Örneğin, Newtonsoft.Json
aşağıdaki JSON'ı 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 tarafından gereklidir ve geçerli JSON olarak kabul edilen tek biçimdir.
Tek tırnak içine alınmış bir değer, aşağıdaki iletiyi içeren bir JsonException ile sonuçlanır:
''' is an invalid start of a value.
Dize özellikleri için dize olmayan değerler
Newtonsoft.Json
, dize türündeki özelliklere seri durumdan çıkarma için sayı veya değişmez değerler true
ve false
gibi dize dışı değerleri kabul eder. Aşağıda, aşağıdaki sınıfa başarıyla seri durumdan çıkaran Newtonsoft.Json
bir JSON örneği verilmiştir:
{
"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 dışı değerleri dize özelliklerine seri durumdan çıkarmaz. Dize alanı için alınan dize olmayan bir değer, aşağıdaki iletiyle JsonException sonucunu 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 desteklenmez, ancak geçici çözümler mümkündür. Geçici çözümler, işlevsellikle Newtonsoft.Json
tam eşlik sağlayabilen özel dönüştürücülerdir. Bunlardan bazıları için örnek kod örnek olarak sağlanır. Bu Newtonsoft.Json
özelliklere güveniyorsanız, geçiş için .NET nesne modellerinizde veya diğer kod değişikliklerinizde 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 Newtonsoft.Json
özelliklere güveniyorsanız, önemli değişiklikler olmadan geçiş mümkün olmayacaktır.
Tırnak içinde numaralara izin verme veya sayı yazma
Newtonsoft.Json
JSON dizeleriyle temsil edilen sayıları seri hale getirebilir veya seri durumdan çıkarabilir (tırnak içine alınır). Örneğin, şunu kabul edebilir: {"DegreesCelsius":"23"}
yerine {"DegreesCelsius":23}
. içinde System.Text.Jsonbu davranışı etkinleştirmek için veya AllowReadingFromStringolarak ayarlayın WriteAsString JsonSerializerOptions.NumberHandling veya [JsonNumberHandling] özniteliğini kullanın.
ASP.NET Core kullanarak dolaylı olarak kullanıyorsanız System.Text.Json
, gibi Newtonsoft.Json
bir davranış elde etmek için hiçbir şey yapmanız gerekmez. ASP.NET Core, kullandığında System.Text.Json
web varsayılanlarını belirtir ve web varsayılanları alıntılanan sayılara izin verir.
Daha fazla bilgi için bkz . Tırnak içinde sayılara izin verme veya bunları yazma.
Seri durumdan çıkarırken kullanılacak oluşturucuyu belirtme
özniteliği, Newtonsoft.Json
[JsonConstructor]
BIR POCO'ya seri durumdan çıkarılırken hangi oluşturucunun çağrılacağını belirtmenize olanak tanır.
System.Text.Json
ayrıca [ JsonConstructor] özniteliğine sahiptir. Daha fazla bilgi için bkz . Sabit türler ve Kayıtlar.
Bir özelliği koşullu olarak yoksayma
Newtonsoft.Json
serileştirme veya seri durumdan çıkarmada bir özelliği koşullu olarak yoksaymanın çeşitli yolları vardır:
DefaultContractResolver
rastgele ölçütlere göre dahil etmek veya yoksaymak için özellikleri seçmenize olanak tanır.- üzerindeki
NullValueHandling
JsonSerializerSettings
veDefaultValueHandling
ayarları, tüm null-değer veya varsayılan değer özelliklerinin yoksayılacağını belirtmenize olanak sağlar. NullValueHandling
özniteliğindeki[JsonProperty]
veDefaultValueHandling
ayarları, null veya varsayılan değer olarak ayarlandığında yoksayılması gereken tek tek özellikleri belirtmenize olanak sağlar.
System.Text.Json seri hale getirme sırasında özellikleri veya alanları yoksaymak için aşağıdaki yolları sağlar:
- Bir özellik üzerindeki [JsonIgnore] özniteliği, özelliğin serileştirme sırasında JSON'dan atlanmasına neden olur.
- IgnoreReadOnlyProperties genel seçeneği, tüm salt okunur özellikleri yoksaymanızı sağlar.
- Alanları dahil ediyorsanız, JsonSerializerOptions.IgnoreReadOnlyFields genel seçenek tüm salt okunur alanları yoksaymanızı sağlar.
- Genel
DefaultIgnoreCondition
seçenek, varsayılan değerleri olan tüm değer türü özelliklerini yoksaymanıza veya null değerleri olan tüm başvuru türü özelliklerini yoksaymanıza olanak tanır.
Buna ek olarak, .NET 7 ve sonraki sürümlerde JSON sözleşmesini, rastgele ölçütlere göre özellikleri yoksayacak şekilde özelleştirebilirsiniz. Daha fazla bilgi için bkz . Özel sözleşmeler.
Genel ve genel olmayan alanlar
Newtonsoft.Json
hem alanları hem de özellikleri serileştirebilir ve seri durumdan çıkarabilirsiniz.
içindeSystem.Text.Json, seri hale getirme veya seri durumdan çıkarma sırasında genel alanları eklemek için genel ayarı veya [JsonInclude] özniteliğini kullanınJsonSerializerOptions.IncludeFields. Örnek için bkz . Alanları ekleme.
Nesne başvurularını ve tanıtıcı döngülerini koruma
Varsayılan olarak, Newtonsoft.Json
değere göre serileştirir. Örneğin, bir nesne aynı Person
nesneye başvuru içeren iki özellik içeriyorsa, bu Person
nesnenin özelliklerinin değerleri JSON'da yinelenir.
Newtonsoft.Json
, başvuruya JsonSerializerSettings
göre seri hale getirmenizi sağlayan bir PreserveReferencesHandling
ayara sahiptir:
- İlk
Person
nesne için oluşturulan JSON'a bir tanımlayıcı meta verileri eklenir. - İkinci
Person
nesne için oluşturulan JSON, özellik değerleri yerine bu tanımlayıcıya bir başvuru içerir.
Newtonsoft.Json
ayrıca özel ReferenceLoopHandling
durum oluşturmak yerine döngüsel başvuruları yoksaymanıza olanak tanıyan bir ayarı vardır.
içindeki başvuruları korumak ve döngüsel başvuruları System.Text.Jsonişlemek için olarak PreserveayarlayınJsonSerializerOptions.ReferenceHandler. ayarı ReferenceHandler.Preserve
ile Newtonsoft.Json
eşdeğerdirPreserveReferencesHandling
= PreserveReferencesHandling.All
.
seçeneğine ReferenceHandler.IgnoreCycles
benzer bir davranışa Newtonsoft.JsonReferenceLoopHandling.Ignore
sahiptir. Bir fark, uygulamanın nesne başvuruyu System.Text.Json yoksaymak yerine başvuru döngülerini JSON belirteci ile null
değiştirmesidir. Daha fazla bilgi için bkz . Döngüsel başvuruları yoksayma.
Newtonsoft.JsonReferenceResolver gibi sınıfı da System.Text.Json.Serialization.ReferenceResolver serileştirme ve seri durumdan çıkarma üzerinde başvuruları koruma davranışını tanımlar. Özel davranışı belirtmek için türetilmiş bir sınıf oluşturun. Ö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.
Dize olmayan anahtar içeren sözlük
System.Text.Json
Hem hem de Newtonsoft.Json
türünde Dictionary<TKey, TValue>
koleksiyonları destekler. Ancak, içinde System.Text.Json
TKey
özel bir tür değil, ilkel bir tür olmalıdır. Daha fazla bilgi için bkz . Desteklenen anahtar türleri.
Dikkat
Bir yerine TKey
string
seri durumdan Dictionary<TKey, TValue>
çıkarma işlemi, tüketen uygulamada güvenlik açığına neden olabilir. Daha fazla bilgi için bkz . dotnet/runtime#4761.
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)
- ExpandoObject
- TimeZoneInfo
- BigInteger
- DBNull
- Type
- ValueTuple ve ilişkili genel türleri
Yerleşik desteği olmayan türler için özel dönüştürücüler uygulanabilir.
Polimorfik serileştirme
Newtonsoft.Json
otomatik olarak polimorfik serileştirme yapar. .NET 7'den başlayarak özniteliği System.Text.Json aracılığıyla çok biçimli serileştirmeyi JsonDerivedTypeAttribute destekler. Daha fazla bilgi için bkz . Türetilmiş sınıfların özelliklerini seri hale getirme.
Polimorfik seri durumdan çıkarma
Newtonsoft.Json
, serileştirme sırasında JSON'a tür adı meta verileri ekleyen bir TypeNameHandling
ayara sahiptir. Seri durumdan çıkarırken meta verileri kullanarak polimorfik seri durumdan çıkarma işlemi yapar. .NET 7'den başlayarak, System.Text.Json polimorfik seri durumdan çıkarma gerçekleştirmek için tür ayrıştırıcı bilgilerine dayanır. Bu meta veriler JSON'da yayılır ve ardından seri durumdan çıkarma sırasında temel türe mi yoksa türetilmiş bir türe mi seri durumdan çıkarılmayacağını belirlemek için kullanılır. Daha fazla bilgi için bkz . Türetilmiş sınıfların özelliklerini seri hale getirme.
Eski .NET sürümlerinde polimorfik seri durumdan çıkarmayı desteklemek için Özel dönüştürücüler yazma'daki örneğe benzer bir dönüştürücü oluşturun.
Dize sabit listesi değerlerini seri durumdan çıkarma
Varsayılan olarak, System.Text.Json dize sabit listesi değerlerini seri durumdan çıkarma desteği sunmaz, ancak Newtonsoft.Json
bunu destekler. Örneğin, aşağıdaki kod bir JsonExceptionoluşturur:
string json = "{ \"Text\": \"Hello\", \"Enum\": \"Two\" }";
var _ = JsonSerializer.Deserialize<MyObj>(json); // Throws exception.
class MyObj
{
public string Text { get; set; } = "";
public MyEnum Enum { get; set; }
}
enum MyEnum
{
One,
Two,
Three
}
Ancak, dönüştürücü kullanarak dize sabit listesi değerlerinin seri durumdan çıkarılabilmesini JsonStringEnumConverter sağlayabilirsiniz. Daha fazla bilgi için bkz . Dize olarak numaralandırmalar.
Nesne özelliklerinin seri durumdan çıkarılması
için seri durumdan ObjectçıkarıldığındaNewtonsoft.Json
:
- JSON yükündeki ilkel değerlerin türünü (dışında
null
) çıkarsar ve depolananstring
,long
,double
,boolean
veyaDateTime
öğesini kutulanmış nesne olarak döndürür. İlkel değerler , JSON numarası, dizetrue
, ,false
veyanull
gibi tek JSON değerleridir. - JSON yükündeki karmaşık değerler için veya
JObject
JArray
döndürür. Karmaşık değerler , küme ayraçları ({}
) içindeki JSON anahtar-değer çiftlerinin koleksiyonları veya köşeli ayraçlar ([]
) içindeki değer listeleridir. Ayraçlar veya köşeli ayraçlar içindeki özellikler ve değerler ek özelliklere veya değerlere sahip olabilir. - Yükte
null
JSON değişmez değeri olduğunda null başvuru döndürür.
System.Text.Jsonolarak seri durumdan Objectçıkarıldığında hem ilkel hem de karmaşık değerler için kutulu JsonElement
depolar, örneğin:
- Bir
object
özellik. - Sözlük
object
değeri. - Bir
object
dizi değeri. - Bir kök
object
.
Ancak, System.Text.Json
yükün içinde JSON değişmez değeri olduğunda null
ile aynı Newtonsoft.Json
şekilde davranır null
ve null başvuru döndürür.
Özellikler için tür çıkarımı uygulamak içinobject
, Özel dönüştürücüler yazma'daki örneğe benzer bir dönüştürücü oluşturun.
Null'ı null olmayan türe seri durumdan çıkarma
Newtonsoft.Json
aşağıdaki senaryoda bir özel durum oluşturmaz:
NullValueHandling
, ve olarakIgnore
ayarlanır- Seri durumdan çıkarma sırasında JSON, boş değer atanamayan bir değer türü için null değer içerir.
Aynı senaryoda, System.Text.Json bir özel durum oluşturur. (içindeki System.Text.Json
karşılık gelen null işleme ayarıdır JsonSerializerOptions.IgnoreNullValues = true
.)
Hedef türün sahibiyseniz, en iyi geçici çözüm söz konusu özelliğin null atanabilir olmasını sağlamaktır (örneğin, olarak değiştirin int
int?
).
Başka bir geçici çözüm türü için bir dönüştürücü oluşturmaktır; örneğin, türler için DateTimeOffset
null değerleri işleyen aşağıdaki örnek:
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);
}
}
Özelliğinde bir öznitelik kullanarak veya dönüştürücüsü koleksiyona ekleyerek bu özel dönüştürücüye Converters kaydedin.
Not: Yukarıdaki dönüştürücü null değerleri varsayılan değerleri belirten POCO'lardan farklı Newtonsoft.Json
işler. Örneğin, aşağıdaki kodun hedef nesnenizi temsil ettiği varsayın:
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; }
}
Yukarıdaki dönüştürücü kullanılarak aşağıdaki JSON'un seri durumdan çıkarıldığını varsayalım:
{
"Date": null,
"TemperatureCelsius": 25,
"Summary": null
}
Seri durumdan çıkarma işleminden Date
sonra özelliğin 1/1/0001 ()default(DateTimeOffset)
değeri vardır; yani oluşturucuda ayarlanan değerin üzerine yazılır. Aynı POCO ve JSON göz önünde bulundurulduğunda seri Newtonsoft.Json
durumdan çıkarma özelliğinde 1/1/2001'i Date
bırakır.
Sabit sınıflar ve yapılar için seri durumdan çıkarma
Newtonsoft.Json
sabit sınıflar ve yapılar için seri durumdan çıkarabilirsiniz çünkü parametreleri olan oluşturucuları kullanabilir.
iç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 durumdan çıkarma hedefleri olarak desteklenir. Daha fazla bilgi için bkz . Sabit türler ve Kayıtlar.
Gerekli özellikler
içinde Newtonsoft.Json
özniteliğini ayarlayarak Required
bir özelliğin [JsonProperty]
gerekli olduğunu belirtirsiniz. Newtonsoft.Json
JSON'da gerekli olarak işaretlenmiş bir özellik için değer alınmazsa bir özel durum oluşturur.
.NET 7'den başlayarak, gerekli bir özellikte C# required
değiştiricisini JsonRequiredAttribute veya özniteliğini kullanabilirsiniz. System.Text.Json JSON yükü işaretli özellik için bir değer içermiyorsa bir özel durum oluşturur. Daha fazla bilgi için bkz . Gerekli özellikler.
Tarih biçimini belirtme
Newtonsoft.Json
ve DateTimeOffset
türlerinin özelliklerinin nasıl serileştirilip seri durumdan DateTime
çıkarıldığını denetlemek için çeşitli yollar sağlar:
- Ayar
DateTimeZoneHandling
, tümDateTime
değerleri UTC tarihleri olarak seri hale getirmek için kullanılabilir. - Ayar
DateFormatString
veDateTime
dö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'ı destekler. Bu biçim yaygın olarak benimsenmiş, net değildir ve gidiş dönüşleri hassas bir şekilde yapar. 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 uzaklığı (veya gibi /Date(1590863400000-0700)/
/Date(1590863400000)/
değerler) ile veya olmadan Unix dönem biçimini kullanan JSON'ı seri hale getirip seri durumdan çıkartır:
sealed class UnixEpochDateTimeOffsetConverter : JsonConverter<DateTimeOffset>
{
static readonly DateTimeOffset s_epoch = new(1970, 1, 1, 0, 0, 0, TimeSpan.Zero);
static readonly Regex s_regex = new("^/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(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 = string.Create(CultureInfo.InvariantCulture, $"/Date({unixTime}{(utcOffset >= TimeSpan.Zero ? "+" : "-")}{utcOffset:hhmm})/");
writer.WriteStringValue(formatted);
}
}
sealed class UnixEpochDateTimeConverter : JsonConverter<DateTime>
{
static readonly DateTime s_epoch = new(1970, 1, 1, 0, 0, 0);
static readonly Regex s_regex = new("^/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 = string.Create(CultureInfo.InvariantCulture, $"/Date({unixTime})/");
writer.WriteStringValue(formatted);
}
}
Daha fazla bilgi için, içindeki DateTime ve DateTimeOffset desteğine System.Text.Jsonbakın.
Geri Çağırmalar
Newtonsoft.Json
serileştirme veya seri durumdan çıkarma işleminin birkaç noktasında özel kod yürütmenize olanak tanır:
- OnDeserializing (bir nesnenin seri durumdan çıkarılmasına başlarken)
- OnDeserialized (bir nesnenin seri durumdan çıkarılması tamamlandığında)
- OnSerializing (bir nesneyi serileştirmeye başlarken)
- OnSerialized (bir nesneyi seri hale getirme tamamlandığında)
System.Text.Json serileştirme ve seri durumdan çıkarma sırasında aynı bildirimleri kullanıma sunar. Bunları kullanmak için ad alanından aşağıdaki arabirimlerden System.Text.Json.Serialization birini veya daha fazlasını uygulayın:
Aşağıda null bir özelliği denetleyebilen ve serileştirme ile seri durumdan çıkarmanın başında ve sonunda iletiler yazan bir örnek verilmiştir:
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=
Kodun OnDeserializing
yeni POCO örneğine erişimi yoktur. Seri durumdan çıkarmanın başlangıcında yeni POCO örneğini işlemek için bu kodu POCO oluşturucusunda yerleştirin.
Ortak olmayan özellik ayarlayıcıları ve alıcıları
Newtonsoft.Json
özniteliği aracılığıyla JsonProperty
özel ve iç özellik ayarlayıcılarını ve alıcılarını kullanabilir.
System.Text.Json[JsonInclude] özniteliği aracılığıyla özel ve iç özellik ayarlayıcılarını ve alıcıları destekler. Örnek kod için bkz . Ortak olmayan özellik erişimcileri.
Varolan nesneleri doldurma
JsonConvert.PopulateObject
içindeki Newtonsoft.Json
yöntemi, JSON belgesini yeni bir örnek oluşturmak yerine mevcut bir sınıf örneğine seri durumdan çıkartır. 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 seri durumdan çıkarılabilir.
Özellikleri değiştirmek yerine yeniden kullanma
.NET 8'den başlayarak, System.Text.Json başlatılan özellikleri değiştirmek yerine yeniden kullanma desteğine sahiptir. API teklifinde okuyabileceğiniz bazı davranış farklılıkları vardır.
Daha fazla bilgi için bkz . Başlatılan özellikleri doldurma.
Özellikleri ayarlayıcılar olmadan doldurma
.NET 8'den başlayarak, System.Text.Json ayarlayıcıya sahip olmayanlar da dahil olmak üzere özellikleri doldurmayı destekler. Daha fazla bilgi için bkz . Başlatılan özellikleri doldurma.
Yılan olayı adlandırma ilkesi
System.Text.Json yılan örneği için yerleşik bir adlandırma ilkesi içerir. Ancak, bazı girişler için ile Newtonsoft.Json
bazı davranış farklılıkları vardır. Aşağıdaki tabloda, ilke kullanılarak giriş dönüştürülürken bu farklardan bazıları gösterilmektedir JsonNamingPolicy.SnakeCaseLower .
Giriş | Newtonsoft.Json sonuç | System.Text.Json sonuç |
---|---|---|
"AB1" | "a_b1" | "ab1" |
"SHA512Managed" | "sh_a512_managed" | "sha512_managed" |
"abc123DEF456" | "abc123_de_f456" | "abc123_def456" |
"KEBAB-CASE" | "keba_b-_case" | "kebab-case" |
System.Runtime.Serialization öznitelikleri
System.Runtime.Serializationgibi öznitelikler DataContractAttributeDataMemberAttributeIgnoreDataMemberAttribute ve bir veri sözleşmesi tanımlamanızı sağlar. Veri sözleşmesi, bir hizmet ile istemci arasında değiş tokuş edilecek verileri soyut olarak açıklayan resmi bir anlaşmadır. Veri sözleşmesi, hangi özelliklerin değişim için seri hale getirildiği kesin olarak tanımlar.
System.Text.Json bu öznitelikler için yerleşik desteğe sahip değildir. Ancak, .NET 7'den başlayarak, destek eklemek için özel bir tür çözümleyici kullanabilirsiniz. Örnek için bkz . ZCS. DataContractResolver.
Sekizli sayılar
Newtonsoft.Json
sayıları baştaki sıfırla sekizli sayılar olarak ele alır. System.Text.JsonRFC 8259 belirtimi bunlara izin vermediğinden baştaki sıfırlara izin vermez.
Eksik üyeleri işleme
Seri durumdan çıkarılmakta olan JSON hedef türünde eksik özellikler içeriyorsa, Newtonsoft.Json
özel durumlar oluşturacak şekilde yapılandırılabilir. Varsayılan olarak, System.Text.Json [JsonExtensionData] özniteliğini kullanmanız dışında JSON'daki ek özellikleri yoksayar.
.NET 8 ve sonraki sürümlerde, aşağıdaki araçlardan birini kullanarak eşlenmemiş JSON özelliklerini atlayıp atlayıp atlamama tercihinizi ayarlayabilirsiniz:
- özniteliğini JsonUnmappedMemberHandlingAttribute seri durumdan çıkardığınız türe uygulayın.
- Tercihinizi genel olarak ayarlamak için özelliğini ayarlayın JsonSerializerOptions.UnmappedMemberHandling . Veya kaynak oluşturma için özelliğini ayarlayın JsonSourceGenerationOptionsAttribute.UnmappedMemberHandling ve özniteliğini sınıfınıza JsonSerializerContext uygulayın.
- özelliğini özelleştirin JsonTypeInfo.UnmappedMemberHandling .
JsonObjectAttribute
Newtonsoft.Json
, hangi üyelerin seri hale getirildiğini, JsonObjectAttribute
değerlerin nasıl null
işleneceğini ve tüm üyelerin gerekli olup olmadığını denetlemek için tür düzeyinde uygulanabilen bir özniteliğine sahiptir. System.Text.Json bir türe uygulanabilecek eşdeğer bir özniteliği yoktur. Değer işleme gibi null
bazı davranışlar için aynı davranışı genelde JsonSerializerOptions veya her özellikte tek tek yapılandırabilirsiniz.
Tüm null
özelliklerin yoksayılması gerektiğini belirtmek için aşağıdaki örneği göz Newtonsoft.Json.JsonObjectAttribute
önünde bulundurun:
[JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)]
public class Person { ... }
içindeSystem.Text.Json, tüm türler ve özellikler için davranışı ayarlayabilirsiniz:
JsonSerializerOptions options = new()
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};
string json = JsonSerializer.Serialize<Person>(person, options);
Ya da her özellikte davranışı ayrı olarak ayarlayabilirsiniz:
public class Person
{
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string? Name { get; set; }
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public int? Age { get; set; }
}
Ardından, tüm üye özelliklerinin JSON'da mevcut olması gerektiğini belirtmek için kullanan Newtonsoft.Json.JsonObjectAttribute
aşağıdaki örneği göz önünde bulundurun:
[JsonObject(ItemRequired = Required.Always)]
public class Person { ... }
C# required
değiştiricisini veya JsonRequiredAttribute öğesini her özelliğe ekleyerek içinde aynı davranışı System.Text.Json elde edebilirsiniz. Daha fazla bilgi için bkz . Gerekli özellikler.
public class Person
{
[JsonRequired]
public string? Name { get; set; }
public required int? Age { get; set; }
}
TraceWriter
Newtonsoft.Json
, serileştirme veya seri durumdan çıkarma tarafından oluşturulan günlükleri görüntülemek için kullanarak TraceWriter
hata ayıklamanıza olanak tanır. System.Text.Json günlüğe kaydetmez.
JToken ile karşılaştırıldığında JsonDocument ve JsonElement (JObject, JArray gibi)
System.Text.Json.JsonDocumentmevcut JSON yüklerinden salt okunur bir Belge Nesne Modeli (DOM) ayrıştırma ve oluşturma olanağı sağlar. DOM, JSON yükündeki 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 yaygın .NET türlerine dönüştürmek için API'ler sağlar. JsonDocument
bir RootElement özelliği kullanıma sunar.
.NET 6'dan başlayarak, türü ve ad alanı içindeki System.Text.Json.Nodes diğer türleri kullanarak JsonNode mevcut JSON yüklerinden değiştirilebilir bir DOM ayrıştırabilir ve oluşturabilirsiniz. Daha fazla bilgi için bkz . Kullanma JsonNode
.
JsonDocument is IDisposable
JsonDocument
havuza alınan arabelleğe verilerin bellek içi görünümünü oluşturur. Bu nedenle, veya JArray
türünden Newtonsoft.Json
JsonDocument
farklı JObject
olarak türü uygular IDisposable
ve bir using bloğu içinde kullanılması gerekir. Daha fazla bilgi için bkz . JsonDocument IDisposable.
JsonDocument salt okunur
System.Text.Json DOM, JSON öğelerini ekleyemez, kaldıramaz veya değiştiremez. Bu yöntem, performans ve ortak JSON yük boyutlarını ayrıştırma (1 MB) < için ayırmaları azaltmak için tasarlanmıştır.
JsonElement bir birleşim yapısıdır
JsonDocument
RootElement
, herhangi bir JSON öğesini kapsayan bir birleşim yapısı türü olan türünün JsonElementözelliği olarak kullanıma sunar. Newtonsoft.Json
, , JArray
JToken
vb. gibi JObject
ayrılmış hiyerarşik türleri kullanır. JsonElement
üzerinde arama yapabilir ve numaralandırabilir ve JSON öğelerini .NET türlerine dönüştürebilmek için kullanabilirsiniz JsonElement
.
.NET 6'dan başlayarak, ad alanında System.Text.Json.Nodes , ve öğesine karşılık gelen JObject
tür ve JToken
türleri kullanabilirsiniz JsonNode JArray
. Daha fazla bilgi için bkz . Kullanma JsonNode
.
Bir JsonDocument ve JsonElement'de alt öğeler için arama
kullanarak JObject
veya JArray
Newtonsoft.Json
kullanarak JSON belirteçleri için yapılan aramalar, bazı sözlüklerde aramalar olduğundan görece hızlı olma eğilimindedir. Karşılaştırmak gerekirse, üzerindeki JsonElement
aramalar özelliklerin sıralı bir aramasını gerektirir ve bu nedenle nispeten yavaştır (örneğin kullanırken TryGetProperty
). System.Text.Json arama zamanı 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 ve JsonTextReader karşılaştırması
System.Text.Json.Utf8JsonReader, READOnlySpan baytından> veya ReadOnlySequence<> baytından okunan UTF-8 kodlu JSON metni için yüksek performanslı, düşük ayırmalı, yalnızca ileriye dönük bir okuyucudur.< Utf8JsonReader
, özel ayrıştırıcılar ve seri durumdan çıkarıcılar oluşturmak için kullanılabilecek düşük düzeyli bir türüdür.
Utf8JsonReader bir başvuru yapısıdır
in JsonTextReader
Newtonsoft.Json
bir sınıftır. Türü Utf8JsonReader
, bir başvuru yapısı olması bakımından farklılık gösterir. Daha fazla bilgi için bkz . Utf8JsonReader için başvuru yapısı sınırlamaları.
Null değerleri null değer türlerine okuma
Newtonsoft.Json
, döndürerek bool?
sizin için bir Null
TokenType
işleyen gibi ReadAsBoolean
, döndüren Nullable<T>API'ler sağlar. Yerleşik API'ler System.Text.Json
yalnızca null atanamayan değer türleri döndürür. Daha fazla bilgi için bkz . Null değerleri null değer türlerine okuma.
JSON okumak için çok hedefli
Belirli hedef çerçeveler için kullanmaya Newtonsoft.Json
devam etmeniz gerekiyorsa, birden çok hedef oluşturabilir ve iki uygulamanız olabilir. Ancak, bu önemsiz değildir ve bazı #ifdefs
ve kaynak yinelemesi gerektirir. Mümkün olduğunca çok kod paylaşmanın bir yolu ve Newtonsoft.Json.JsonTextReader
çevresinde Utf8JsonReader bir ref struct
sarmalayıcı oluşturmaktır. Bu sarmalayıcı, davranış farklılıkları yalıtılırken genel yüzey alanını birleştirecektir. Bu, değişiklikleri esas olarak türün yapısında yalıtmanıza ve yeni türü başvuruya göre geçirmenize olanak tanır. Bu, Microsoft.Extensions.DependencyModel kitaplığının izlediği desendir:
Utf8JsonWriter ve JsonTextWriter karşılaştırması
System.Text.Json.Utf8JsonWriter, Int32
ve DateTime
gibi String
yaygın .NET türlerinden UTF-8 kodlu JSON metni yazmanın yüksek performanslı bir yoludur. Yazıcı, özel seri hale getiriciler oluşturmak için kullanılabilecek düşük düzeyli bir türdür.
Ham değerler yazma
Newtonsoft.Json
bir WriteRawValue
değerin beklendiği yerde ham JSON yazan bir yönteme sahiptir. System.Text.Json doğrudan eşdeğeri vardır: Utf8JsonWriter.WriteRawValue. Daha fazla bilgi için bkz . Ham JSON yazma.
JSON biçimini özelleştirme
JsonTextWriter
eşdeğeri olmayan aşağıdaki ayarları Utf8JsonWriter içerir:
- QuoteChar - Dize değerlerini çevrelemek için kullanılacak karakteri belirtir.
Utf8JsonWriter
her zaman çift tırnak kullanır. - QuoteName - Özellik adlarının tırnak içine alınıp alınmayacağını belirtir.
Utf8JsonWriter
her zaman tırnak içine alır.
.NET 9'dan başlayarak, yapı tarafından JsonWriterOptions sunulan seçenekleri kullanmak için Utf8JsonWriter girinti karakterini ve boyutunu özelleştirebilirsiniz:
JsonTextWriter
eşdeğeri olmayan aşağıdaki ayarları Utf8JsonWriter
içerir:
- Girinti - Girintilemenin kaç karakter yapılacağını belirtir.
Utf8JsonWriter
her zaman 2 karakter girintili. - IndentChar - Girintileme için kullanılacak karakteri belirtir.
Utf8JsonWriter
her zaman boşluk kullanır. - QuoteChar - Dize değerlerini çevrelemek için kullanılacak karakteri belirtir.
Utf8JsonWriter
her zaman çift tırnak kullanır. - QuoteName - Özellik adlarının tırnak içine alınıp alınmayacağını belirtir.
Utf8JsonWriter
her zaman tırnak içine alır.
tarafından Utf8JsonWriter
üretilen JSON'yi bu yollarla özelleştirmenize olanak sağlayan bir geçici çözüm yoktur.
Zaman aralığı, Uri veya karakter değerleri yazma
JsonTextWriter
WriteValue
TimeSpan, Uri ve char değerleri için yöntemler sağlar. Utf8JsonWriter
eşdeğer yöntemlere sahip değildir. Bunun yerine, bu değerleri dize olarak biçimlendirin (örneğin çağrısı ToString()
yaparak) ve çağrısı yapın WriteStringValue.
JSON yazmak için çok hedefli
Belirli hedef çerçeveler için kullanmaya Newtonsoft.Json
devam etmeniz gerekiyorsa, birden çok hedef oluşturabilir ve iki uygulamanız olabilir. Ancak, bu önemsiz değildir ve bazı #ifdefs
ve kaynak yinelemesi gerektirir. Mümkün olduğunca çok kod paylaşmanın bir yolu ve Newtonsoft.Json.JsonTextWriter
çevresinde Utf8JsonWriter bir sarmalayıcı oluşturmaktır. Bu sarmalayıcı, davranış farklılıkları yalıtılırken genel yüzey alanını birleştirecektir. Bu, değişiklikleri esas olarak türün yapısına göre yalıtmanızı sağlar. Microsoft.Extensions.DependencyModel kitaplığı aşağıdaki gibidir:
TypeNameHandling.All desteklenmiyor
-eşdeğer işlevselliği hariç System.Text.Json
tutma TypeNameHandling.All
kararı kasıtlı olarak yapıldı. Bir JSON yükünün kendi tür bilgilerini belirtmesine izin vermek, web uygulamalarında yaygın bir güvenlik açığı kaynağıdır. Özellikle ile TypeNameHandling.All
yapılandırmasıNewtonsoft.Json
, uzak istemcinin yürütülebilir bir uygulamanın tamamını JSON yükünün içine eklemesine olanak tanır, böylece seri durumdan çıkarma sırasında web uygulaması ekli kodu ayıklar ve çalıştırır. Daha fazla bilgi için bkz . Cuma günü 13. JSON saldırıları PowerPoint ve Cuma günü 13. JSON saldırıları ayrıntıları.
JSON Yolu sorguları desteklenmiyor
JsonDocument
DOM, JSON Yolu kullanarak sorgulamayı desteklemez.
JsonNode DOM'da her JsonNode
örnek, bu düğümün yolunu döndüren bir yönteme sahiptirGetPath
. 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 sorununa bakın.
Bazı sınırlar yapılandırılamaz
System.Text.Json , karakter cinsinden (166 MB) ve temel 64 (125 MB) en büyük belirteç boyutu gibi bazı değerler için değiştirilmeyecek sınırları ayarlar. Daha fazla bilgi için kaynak kodu ve GitHub sorunu dotnet/runtime #39953 bölümüne bakınJsonConstants
.
NaN, Infinity, -Infinity
Newtonsoft, , Infinity
ve -Infinity
JSON dize belirteçlerini ayrıştırıyorNaN
. ile System.Text.Jsonkullanın JsonNumberHandling.AllowNamedFloatingPointLiterals. Bu ayarın nasıl kullanılacağı hakkında bilgi için bkz . Tırnak içinde sayılara izin verme veya sayı yazma.
Geçiş için GitHub Copilot kullanma
Kodunuzu IDE'niz içinde dönüştürmek için GitHub Copilot'tan kodlama yardımı alabilirsiniz.
Visual Studio 2022 sürüm 17.8 veya üzerini kullanıyorsanız, kodunuzu kullanmak System.Text.Json
üzere geçirmenize Newtonsoft.Json
yardımcı olmak için Visual Studio'da yapay zeka temelli GitHub Copilot'ı deneyebilirsiniz. Sorunuzu ve dönüştürülecek kodu aşağıdaki örnekte olduğu gibi yardımcı pilot sohbet penceresinde istem olarak gönderin.
Not
GitHub Copilot yapay zeka ile desteklendiğinden sürprizler ve hatalar mümkündür. Oluşturulan tüm kodları veya önerileri doğruladığından emin olun. GitHub Copilot'ın genel kullanımı, ürün etkisi, insan gözetimi ve gizlilik hakkında daha fazla bilgi için bkz . GitHub Copilot SSS.
Copilot Sohbeti için örnek istem
convert the following code to use System.Text.Json
Product product = new Product();
product.Name = "Apple";
product.ExpiryDate = new DateTime(2024, 08, 08);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };
string output = JsonConvert.SerializeObject(product);
Console.WriteLine(output);
Örnek Copilot Sohbet yanıtı
To convert the code to use System.Text.Json, you can use the JsonSerializer class. Here's the updated code:
using System;
using System.Text.Json;
public class Product
{
public string Name { get; set; }
public DateTime ExpiryDate { get; set; }
public decimal Price { get; set; }
public string[] Sizes { get; set; }
}
public class Program
{
public static void Main()
{
Product product = new Product();
product.Name = "Apple";
product.ExpiryDate = new DateTime(2024, 08, 08);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };
string output = JsonSerializer.Serialize(product);
Console.WriteLine(output);
}
}
This code uses System.Text.Json.JsonSerializer.Serialize to convert the Product object to a JSON string.
Sonuçlarınızın bu örnek yanıtlarda gösterilenden farklı olabileceğini unutmayın. Yapay zeka modelleri belirlenemez, yani aynı soru sorulduğunda farklı yanıtlar döndürebilirler. Bunun nedeni zaman içindeki ek öğrenme ve uyum, dil varyasyonu, sohbet geçmişiniz gibi bağlam değişiklikleri ve daha fazlası olabilir.
Amacı ayarlamak ve kapsamlı bağlamla daha iyi yanıtlar almak için eğik çizgi komutları, başvurular ve iş parçacıkları gibi sohbet özelliklerini kullanabilirsiniz.
Örneğin, kod dosyanız filename
IDE'de açıksa, "kullanmaya System.Text.Json
dönüştür#filename
" ile Copilot Sohbeti'ne isteminizde dosyaya başvurabilirsiniz. Alternatif olarak, sohbet penceresinde veya satır içi sohbette "kullanmak System.Text.Json
için dönüştür@workspace
" ile çözüme başvurabilirsiniz.