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.