JSON.net ContractResolver vs. JsonConverter

ile çalışıyorum JSON.net bir süreliğine. Hem özel dönüştürücüler hem de özel sözleşme çözümleyicileri (genellikle S. O. ve Newtonsoft web sitesindeki örnekleri değiştirmekten) yazdım ve iyi çalışıyorlar.

meydan okuma, örneklerden başka, işleme için bir veya diğerini (veya her ikisini de) ne zaman kullanmam gerektiği konusunda çok az açıklama görüyorum. Kendi deneyimimle, temelde sözleşme çözümleyicilerinin daha basit olduğunu belirledim, bu yüzden ihtiyacım olan şeyi yapabilirsem onlarla birlikte, bu şekilde gidiyorum; aksi takdirde, özel JsonConverters kullanıyorum. Ancak, her ikisinin de bazen birlikte kullanıldığını daha da biliyorum, bu yüzden kavramlar daha da opaklaşıyor.

sorular:

  1. kullanıcı ne zaman diğerine ayıran bir kaynak var mı? Newtonsoft belgelerini, ikisinin nasıl farklılaştığı veya bir veya diğerini ne zaman kullanacağı konusunda belirsiz buluyorum.
  2. ikisi arasında sipariş boru hattı nedir?
36
tarihinde sordu Brian Rogers 2016-12-11 19:40:32
kaynak

1 ответов

büyük soru. Belirli bir sorunu çözmek için özel bir ContractResolver veya özel bir JsonConverter yazmayı tercih ettiğinizde açık bir belge parçası görmedim. Gerçekten farklı şeyler yapıyorlar, ancak her biri tarafından hangi tür sorunların çözülebileceği arasında bazı örtüşmeler var. StackOverflow ile ilgili soruları yanıtlarken her birinin adil bir numarası yazdım, bu yüzden resim biraz daha fazla oldu zamanla bana açık ol. Aşağıda benim üstleniyorum.

ContractResolver

bir sözleşme çözümleyici her zaman tarafından kullanılan Json.Net ve serileştirme / serileştirme davranışını geniş bir seviyede yönetir. Ayarlarda sağlanan özel bir çözümleyici yoksa, DefaultContractResolver kullanılır. Çözümleyici belirlemekten sorumludur:

  • ne sözleşme her tür (yani bir ilkel, dizi/liste, sözlük, dinamik mi, JObject , düz eski nesne, vb.);
  • hangi özellikler türü (varsa) ve adları, türleri ve erişilebilirlik nelerdir;
  • ne nitelikleri uygulanmıştır (örn. [JsonProperty] , [JsonIgnore] , [JsonConverter] , vb.), ve
  • bu niteliklerin nasıl olması gerektiği her özelliğin (veya sınıfın) (de) serileştirilmesini etkiler.

genel olarak konuşursak, çok çeşitli sınıflarda serileştirme veya serileştirmenin bazı yönlerini özelleştirmek istiyorsanız, muhtemelen bunu yapmak için ContractResolver kullanmanız gerekecektir. İşte ContractResolver kullanarak özelleştirebileceğiniz bazı örnekler:

JsonConverter

bir ContractResolver aksine, JsonConverter odağı daha dar: gerçekten tek bir tür veya ilgili türlerin küçük bir alt kümesi için seri hale getirme veya seri hale getirme işlemek için tasarlanmıştır. Ayrıca, bir çözümleyiciden daha düşük bir seviyede çalışır. Bir dönüştürücü bir tür için sorumluluk verildiğinde, JSON'UN bu tür için nasıl okunduğuna veya yazıldığına dair tam kontrole sahiptir: doğrudan JsonReader ve JsonWriter sınıflarını işini yapmak için kullanır. Başka bir deyişle, bu tür için JSON şekli değiştirebilirsiniz. Aynı zamanda, bir dönüştürücü "büyük resim" den ayrılır ve erişimi yoktur nesnenin üst (de)seri hale getirilmiş veya onunla birlikte kullanılan özellik öznitelikleri gibi bağlamsal bilgiler. JsonConverter ile çözebileceğiniz bazı sorunlar örnekleri:

102
cevap Brian Rogers 2017-05-23 13:31:23
kaynak

Diğer sorular json.net