Kerangka kerja serialisasi mana yang Anda gunakan?
Pavel Gatilov
37
IgnoreDataMemberScriptIgnoreJsonIgnoretergantung pada serializer yang Anda gunakan
LB
3
juga patut diperhatikan adalah atribut [NonSerialized], yang hanya berlaku untuk bidang (bukan properti), tetapi sebaliknya memiliki efek yang sama dengan JsonIgnore.
Triynko
Komentar Trynko sangat berguna .... jika Anda menggunakan IgnoreDataMember pada bidang tidak akan ada kesalahan, tetapi itu tidak akan diterapkan.
Tillito
Jawaban:
147
Jika Anda menggunakan System.Web.Script.Serializationdalam kerangka NET. Anda dapat menempatkan ScriptIgnoreatribut pada anggota yang tidak boleh serial. Lihat contoh yang diambil dari sini :
Jika Anda menggunakan atribut Json.Net[JsonIgnore] hanya akan mengabaikan bidang / properti saat membuat serial atau deserialising.
publicclassCar{// included in JSONpublicstringModel{get;set;}publicDateTimeYear{get;set;}publicList<string>Features{get;set;}// ignored[JsonIgnore]publicDateTimeLastModified{get;set;}}
Atau Anda dapat menggunakan atribut DataContract dan DataMember untuk membuat serialisasi / deserialize properti / bidang secara selektif.
[DataContract]publicclassComputer{// included in JSON[DataMember]publicstringName{get;set;}[DataMember]publicdecimalSalePrice{get;set;}// ignoredpublicstringManufacture{get;set;}publicintStockCount{get;set;}publicdecimalWholeSalePrice{get;set;}publicDateTimeNextShipmentDate{get;set;}}
Jika saya OP, saya lebih suka jawaban ini daripada solusi [ScriptIgnore] yang dipilih. Terutama karena kongruensi solusi Json jadi masalah Json. Mengapa melibatkan System.Web.Extensions ketika perpustakaan yang Anda gunakan memberikan solusi? IMHO terbaik mutlak adalah atribut [IgnoreDataMember], sebagai System.Runtime.Serialization harus kompatibel dengan setiap serializer jika Anda ingin menukar Json.
Steve H.
IgnoreDataMembertidak bekerja dengan JsonResultserializer default .
hendryanw
1
NewtonSoft hanya membantu saya sepenuhnya. Itu membuat json saya terlihat bersih tanpa ada sifat berantakan yang disertakan dari model saya yang hanya untuk backend.
Sorangwala Abbasali
1
@JC Raja Bagaimana saya bisa mengabaikan properti selama desalinizing hanya ketika properti ini null
user123456
1
[NewtonSoft.Json] Saya ingin mengabaikan serialisasi saja. Lalu ada solusi untuk ini?
URL dalam jawaban Anda rusak. Apakah [ScriptIgnore]yang harus digunakan di properti jika controller Anda menggunakan basis MVC Controller return Json(...?
Don Cheadle
2
Saya tahu ini adalah komentar lama, tapi ya, gunakan [ScriptIgnore]di MVC Controller. Namun berhati-hatilah, jika Anda menggunakan SignalR , maka Anda juga harus menggunakannya [JsonIgnore].
Sam
22
Maaf saya memutuskan untuk menulis jawaban lain karena tidak ada jawaban lain yang cukup bisa di-paste.
Jika Anda tidak ingin menghiasi properti dengan beberapa atribut, atau jika Anda tidak memiliki akses ke kelas, atau jika Anda ingin memutuskan apa yang akan diserialisasi selama runtime, dll. Inilah cara Anda melakukannya di Newtonsoft.Json
//short helper class to ignore some properties from serializationpublicclassIgnorePropertiesResolver:DefaultContractResolver{privateIEnumerable<string> _propsToIgnore;publicIgnorePropertiesResolver(IEnumerable<string> propNamesToIgnore){
_propsToIgnore = propNamesToIgnore;}protectedoverrideJsonPropertyCreateProperty(MemberInfo member,MemberSerialization memberSerialization){JsonProperty property =base.CreateProperty(member, memberSerialization);
property.ShouldSerialize=(x)=>{return!_propsToIgnore.Contains(property.PropertyName);};return property;}}
PEMBARUAN PENTING: pastikan Anda men-cache ContractResolverobjek jika Anda memutuskan untuk menggunakan jawaban ini, jika tidak kinerjanya akan menurun.
Jika Anda tidak begitu tertarik untuk harus menghias kode dengan Atribut seperti saya, terutama ketika Anda tidak bisa mengatakan pada waktu kompilasi apa yang akan terjadi di sini adalah solusi saya.
Menggunakan Javascript Serializer
publicstaticclassJsonSerializerExtensions{publicstaticstringToJsonString(thisobject target,bool ignoreNulls =true){var javaScriptSerializer =newJavaScriptSerializer();if(ignoreNulls){
javaScriptSerializer.RegisterConverters(new[]{newPropertyExclusionConverter(target.GetType(),true)});}return javaScriptSerializer.Serialize(target);}publicstaticstringToJsonString(thisobject target,Dictionary<Type,List<string>> ignore,bool ignoreNulls =true){var javaScriptSerializer =newJavaScriptSerializer();foreach(var key in ignore.Keys){
javaScriptSerializer.RegisterConverters(new[]{newPropertyExclusionConverter(key, ignore[key], ignoreNulls)});}return javaScriptSerializer.Serialize(target);}}publicclassPropertyExclusionConverter:JavaScriptConverter{privatereadonlyList<string> propertiesToIgnore;privatereadonlyType type;privatereadonlybool ignoreNulls;publicPropertyExclusionConverter(Type type,List<string> propertiesToIgnore,bool ignoreNulls){this.ignoreNulls = ignoreNulls;this.type = type;this.propertiesToIgnore = propertiesToIgnore ??newList<string>();}publicPropertyExclusionConverter(Type type,bool ignoreNulls):this(type,null, ignoreNulls){}publicoverrideIEnumerable<Type>SupportedTypes{get{returnnewReadOnlyCollection<Type>(newList<Type>(new[]{this.type }));}}publicoverrideIDictionary<string,object>Serialize(object obj,JavaScriptSerializer serializer){var result =newDictionary<string,object>();if(obj ==null){return result;}var properties = obj.GetType().GetProperties();foreach(var propertyInfo in properties){if(!this.propertiesToIgnore.Contains(propertyInfo.Name)){if(this.ignoreNulls && propertyInfo.GetValue(obj,null)==null){continue;}
result.Add(propertyInfo.Name, propertyInfo.GetValue(obj,null));}}return result;}publicoverrideobjectDeserialize(IDictionary<string,object> dictionary,Type type,JavaScriptSerializer serializer){thrownewNotImplementedException();//Converter is currently only used for ignoring properties on serialization}}
Perubahan kecil dalam logika dan PropertyExclusionConverterdapat diubah menjadi PropertyInclusionConverter.
Zarepheth
ini luar biasa
SaiKiran Mandhala
Salah satu masalah potensial dengan ini adalah bahwa ia harus melakukan pencocokan nama dan pengecualian kerja setiap kali objek serial. Namun, setelah dikompilasi, properti tipe tidak akan berubah - Anda harus membuat ini pra-kalkulasi, per jenis, nama-nama yang harus dimasukkan dan hanya menggunakan kembali daftar di setiap baris. Untuk pekerjaan serialisasi JSON yang sangat masif, caching dapat membuat perbedaan nyata dalam kinerja.
ErikE
9
Jika Anda menggunakan System.Text.Jsonmaka Anda dapat menggunakan [JsonIgnore].
FQ:System.Text.Json.Serialization.JsonIgnoreAttribute
Perpustakaan dibangun sebagai bagian dari kerangka kerja bersama .NET Core 3.0.
Untuk kerangka kerja target lainnya, instal paket System.Text.Json NuGet. Paket ini mendukung:
IgnoreDataMember
ScriptIgnore
JsonIgnore
tergantung pada serializer yang Anda gunakanJawaban:
Jika Anda menggunakan
System.Web.Script.Serialization
dalam kerangka NET. Anda dapat menempatkanScriptIgnore
atribut pada anggota yang tidak boleh serial. Lihat contoh yang diambil dari sini :PS. Jangan lupa menambahkan referensi ke "
System.Web.Extensions
" agar ini berfungsisumber
ScriptIgnore
diSystem.Web.Script.Serialization
namespace.Jika Anda menggunakan atribut Json.Net
[JsonIgnore]
hanya akan mengabaikan bidang / properti saat membuat serial atau deserialising.Atau Anda dapat menggunakan atribut DataContract dan DataMember untuk membuat serialisasi / deserialize properti / bidang secara selektif.
Rujuk http://james.newtonking.com/archive/2009/10/23/efisien-json-with-json-net-reducing-serialized-json-size untuk detail lebih lanjut
sumber
IgnoreDataMember
tidak bekerja denganJsonResult
serializer default .Anda bisa menggunakan
[ScriptIgnore]
:Referensi di sini
Dalam hal ini Id dan nama hanya akan diserialisasi
sumber
[ScriptIgnore]
yang harus digunakan di properti jika controller Anda menggunakan basis MVC Controllerreturn Json(...
?[ScriptIgnore]
di MVC Controller. Namun berhati-hatilah, jika Anda menggunakan SignalR , maka Anda juga harus menggunakannya[JsonIgnore]
.Maaf saya memutuskan untuk menulis jawaban lain karena tidak ada jawaban lain yang cukup bisa di-paste.
Jika Anda tidak ingin menghiasi properti dengan beberapa atribut, atau jika Anda tidak memiliki akses ke kelas, atau jika Anda ingin memutuskan apa yang akan diserialisasi selama runtime, dll. Inilah cara Anda melakukannya di Newtonsoft.Json
Pemakaian
Saya telah menerbitkan kode di sini kalau-kalau ada yang ingin menambahkan sesuatu
https://github.com/jitbit/JsonIgnoreProps
PEMBARUAN PENTING: pastikan Anda men-cache
ContractResolver
objek jika Anda memutuskan untuk menggunakan jawaban ini, jika tidak kinerjanya akan menurun.sumber
Jika Anda tidak begitu tertarik untuk harus menghias kode dengan Atribut seperti saya, terutama ketika Anda tidak bisa mengatakan pada waktu kompilasi apa yang akan terjadi di sini adalah solusi saya.
Menggunakan Javascript Serializer
sumber
PropertyExclusionConverter
dapat diubah menjadiPropertyInclusionConverter
.Jika Anda menggunakan
System.Text.Json
maka Anda dapat menggunakan[JsonIgnore]
.FQ:
System.Text.Json.Serialization.JsonIgnoreAttribute
Microsoft Documents Resmi: JsonIgnoreAttribute
Seperti yang dinyatakan di sini :
sumber
Anda juga dapat menggunakan
[NonSerialized]
atributDari dokumen MS :
Jika Anda menggunakan Unity misalnya ( ini bukan hanya untuk Unity ) maka ini berfungsi dengan baik
UnityEngine.JsonUtility
sumber