Comment désactiver TypeNameHandling lorsqu’il est spécifié dans des atsortingbuts en utilisant JsonSerializerSettings dans Json.NET?

Parfois, j’ai besoin de supprimer la sortie des propriétés "$type" par Json.NET même lorsque cela est spécifié par JsonPropertyAtsortingbute.ItemTypeNameHandling . Comment cela peut-il être fait?

Ma classe racine ressemble à celle ci-dessous:

 public class DomainResource { [JsonProperty(ItemTypeNameHandling = TypeNameHandling.Auto)] public List Extensions { get; set; } } 

Et en plus, j’ai une hiérarchie de classes pour Extension comme celle-ci:

 public class Extension { readonly ssortingng url; public ssortingng Url { get { return url; } } public Extension(ssortingng url) { this.url = url; } } public class IntegerExtension : Extension { public IntegerExtension(ssortingng url) : base(url) { } [JsonProperty("ValueInteger")] public int Value { get; set; } } 

Je souhaite ignorer ItemTypeNameHandling dans certains scénarios lors de la sérialisation, mais je ne parviens pas à trouver un moyen de le faire. J’ai essayé de définir JsonSerializerSettings avec TypeNameHandling.None en tant qu’entrée pour jsonconvert lorsque je ne veux pas "$type" propriétés "$type" à l’aide du code ci-dessous:

 public static ssortingng SerializeObject(object value) { JsonSerializerSettings jsonSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore, TypeNameHandling = TypeNameHandling.None, }; jsonSettings.Converters.Add(new SsortingngEnumConverter { CamelCaseText = true }); return JsonConvert.SerializeObject(value, Formatting.None, jsonSettings); } 

Et puis utilisez-le comme suit:

 var res = new DomainResource(); res.Extensions = new List(); res.Extensions.Add(new IntegerExtension("ewwer"){Value = 3}); var x = CustomJsonConvert.SerializeObject(res); 

Mon JSON souhaité est:

{“extensions”: [{“valueInteger”: 3, “url”: “ewwer”}]}

Mais à la place, il contient les propriétés "$type" comme indiqué ci-dessous:

{“extensions”: [{“$ type”: “DicomtoJsonConverter.IntegerExtension, DicomtoJsonConverter”, “valueInteger”: 3, “url”: “ewwer”}]}

Comment puis-je supprimer la sortie des propriétés "$type" sans changer la classe DomainResource ?

Vous pouvez utiliser un ContractResolver personnalisé pour supprimer la sortie des informations de type même lorsque spécifié par JsonPropertyAtsortingbute.TypeNameHandling , JsonPropertyAtsortingbute.ItemTypeNameHandling ou JsonContainerAtsortingbute.ItemTypeNameHandling . Tout d’abord, définissez le résolveur de contrat suivant:

 public class NoTypeNameHandlingContractResolver : DefaultContractResolver { protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { var property = base.CreateProperty(member, memberSerialization); // Suppress JsonPropertyAtsortingbute.TypeNameHandling property.TypeNameHandling = null; // Suppress JsonPropertyAtsortingbute.ItemTypeNameHandling property.ItemTypeNameHandling = null; return property; } protected override JsonContract CreateContract(Type objectType) { var contract = base.CreateContract(objectType); if (contract is JsonContainerContract) { // Suppress JsonContainerAtsortingbute.ItemTypeNameHandling ((JsonContainerContract)contract).ItemTypeNameHandling = null; } return contract; } } 

Ensuite, modifiez CustomJsonConvert.SerializeObject() comme suit:

 public static class CustomJsonConvert { // You may want to cache the contract resolver for best performance, see // https://stackoverflow.com/questions/33557737/does-json-net-cache-types-serialization-information static readonly JsonSerializerSettings jsonSettings; static CustomJsonConvert() { jsonSettings = new JsonSerializerSettings { ContractResolver = new NoTypeNameHandlingContractResolver { NamingStrategy = new CamelCaseNamingStrategy { // These are the settings used by CamelCasePropertyNamesContractResolver by default. // Change them if this is not what you want. OverrideSpecifiedNames = true, ProcessDictionaryKeys = true, }, }, NullValueHandling = NullValueHandling.Ignore, TypeNameHandling = TypeNameHandling.None, Converters = { new SsortingngEnumConverter { CamelCaseText = true } }, }; } public static ssortingng SerializeObject(object value) { return JsonConvert.SerializeObject(value, Formatting.None, jsonSettings); } } 

Si vous utilisez une version de Json.NET antérieure à la version 9.0.1, vous devrez sous- CamelCasePropertyNamesContractResolver plutôt que de sous- NamingStrategy DefaultContractResolver depuis l’introduction de NamingStrategy dans cette version.