J’utilise la bibliothèque Newtonsoft.Json
Existe-t-il un moyen de supprimer les espaces de toutes les données de chaîne lors de la désérialisation?
class Program { class Person { [JsonProperty("name")] public ssortingng Name; } static void Main(ssortingng[] args) { var p = JsonConvert.DeserializeObject(@"{ name: "" John "" }"); Console.WriteLine("Name is: \"{0}\"", p.Name); } }
Ajoutée:
Enfin, j’ai une solution avec un convertisseur personnalisé. Pas sympa, mais mieux que la propriété avec Trim ().
Si quelqu’un a des idées sur la façon de le faire de manière plus naturelle, veuillez la bienvenue.
class Program { sealed class TrimAtsortingbute : Atsortingbute { } class TrimConverter : JsonConverter where T : new() { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var jObject = JObject.Load(reader); var obj = new T(); serializer.Populate(jObject.CreateReader(), obj); var props = objectType.GetFields(BindingFlags.Instance | BindingFlags.Public) .Where(p => p.FieldType == typeof(ssortingng)) .Where(p => Atsortingbute.GetCustomAtsortingbutes(p).Any(u => (Type) u.TypeId == typeof(TrimAtsortingbute))) ; foreach (var fieldInfo in props) { var val = (ssortingng) fieldInfo.GetValue(obj); fieldInfo.SetValue(obj, val.Trim()); } return obj; } public override bool CanConvert(Type objectType) { return objectType.IsAssignableFrom(typeof (T)); } } [JsonConverter(typeof(TrimConverter))] class Person { [JsonProperty("name")] [Trim] public ssortingng Name; [JsonProperty("surname")] public ssortingng Surname; } static void Main(ssortingng[] args) { var p = JsonConvert.DeserializeObject(@"{ name: "" John "", surname: "" Smith "" }"); Console.WriteLine("Name is: \"{0}\", \"{1}\"", p.Name, p.Surname); } }
Vous pouvez écrire votre propre JsonConverter
:
public class TrimmingConverter : JsonConverter { public override bool CanRead => true; public override bool CanWrite => false; public override bool CanConvert(Type objectType) => objectType == typeof(ssortingng); public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { return ((ssortingng)reader.Value)?.Trim(); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } }
Vous pouvez l’utiliser comme ceci pour appliquer à tous les champs de chaîne:
var json = @"{ name:"" John "" }" var p = JsonConvert.DeserializeObject(json, new TrimmingConverter()); Console.WriteLine("Name is: \"{0}\"", p.Name); //Name is: "John"
Ou vous pouvez appliquer cela à certains champs uniquement:
public class Person { [JsonProperty("name")] [JsonConverter(typeof(TrimmingConverter))] // <-- that's the important line public string Name { get; set; } [JsonProperty("other")] public string Other { get; set; } } var json = @"{ name:"" John "", other:"" blah blah blah "" }" var p = JsonConvert.DeserializeObject(json); Console.WriteLine("Name is: \"{0}\"", p.Name); Console.WriteLine("Other is: \"{0}\"", p.Other); //Name is: "John" //Other is: " blah blah blah "
La solution fournie ci-dessus n’a pas fonctionné pour moi. J’ai modifié la solution Sam Fisher et l’ai combinée avec la solution Timmerz. Comment obtenir les deux champs et propriétés en un seul appel via reflection?
public sealed class TrimAtsortingbute : Atsortingbute { } public static class TrimConverterExtension { public static void SetValue(this MemberInfo member, object property, object value) { switch (member.MemberType) { case MemberTypes.Property: ((PropertyInfo)member).SetValue(property, value, null); break; case MemberTypes.Field: ((FieldInfo)member).SetValue(property, value); break; default: throw new Exception("Property must be of type FieldInfo or PropertyInfo"); } } public static object GetValue(this MemberInfo member, object property) { switch (member.MemberType) { case MemberTypes.Property: return ((PropertyInfo)member).GetValue(property, null); case MemberTypes.Field: return ((FieldInfo)member).GetValue(property); default: throw new Exception("Property must be of type FieldInfo or PropertyInfo"); } } public static Type GetMemberType(this MemberInfo member) { switch (member.MemberType) { case MemberTypes.Field: return ((FieldInfo)member).FieldType; case MemberTypes.Property: return ((PropertyInfo)member).PropertyType; case MemberTypes.Event: return ((EventInfo)member).EventHandlerType; default: throw new ArgumentException("MemberInfo must be if type FieldInfo, PropertyInfo or EventInfo", "member"); } } } public class TrimConverter : JsonConverter where T : new() { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var jObject = JObject.Load(reader); var obj = new T(); serializer.Populate(jObject.CreateReader(), obj); //Looks for the sortingm atsortingbute on the property const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance; IEnumerable members = objectType.GetFields(bindingFlags).Cast () .Concat(objectType.GetProperties(bindingFlags)) .Where(p => p.GetMemberType() == typeof(ssortingng)) .Where(p => Atsortingbute.GetCustomAtsortingbutes(p).Any(u => (Type)u.TypeId == typeof(TrimAtsortingbute))) .ToArray(); foreach (var fieldInfo in members) { var val = (ssortingng)fieldInfo.GetValue(obj); if (!ssortingng.IsNullOrEmpty(val)) { fieldInfo.SetValue(obj, val.Trim()); } } return obj; } public override bool CanConvert(Type objectType) { return objectType.IsAssignableFrom(typeof(T)); } }