通过Attributes指定的转换器等同于json.net中的全局转换器
使用Newtonsoft.Json时,我可以通过向顶级SerializerSettings添加转换器或将其提供给转换调用来实现我所需要的 – 一切运行良好.
我希望提取一些全局转换器,而不是在实际需要转换的相关位置以声明方式应用. 我知道以下技巧: – >类型级别[JsonConverter(typeof(Converters.StringEnumConverter))]直接在类型X上 我遇到的问题是我所使用的一些全局转换器在嵌套类型上运行,例如如果我有类型Tuple< X [],Nullable< X>>类型的成员,我无法表达“如果你在处理这个字段时遇到一个X或者它的任何一个孩子,那么转换”是语义而是得到一个Newtonsoft.Json.JsonSerializationException. 这样的“对于这棵树,还请使用这个转换器吗”机制存在吗?我想避免为我想要转换的任何东西定义顶级类型,然后用JsonConverter标记该类型来解决这个问题?
如果我理解正确并且根据官方文档,您可以直接应用转换器并使用自定义转换器按类型过滤:
SomeType someObject = new SomeType(); string json = JsonConvert.SerializeObject(someObject,Formatting.Indented,new MyCustomConverter(typeof(SomeType))); public class MyCustomConverter : JsonConverter { private readonly Type[] _types; public MyCustomConverter (params Type[] types) { _types = types; } public override void WriteJson(JsonWriter writer,object value,JsonSerializer serializer) { JToken t = JToken.FromObject(value); if (t.Type != JTokenType.Object) { t.WriteTo(writer); } else { JObject o = (JObject)t; IList<string> propertyNames = o.Properties().Select(p => p.Name).ToList(); o.AddFirst(new JProperty("Keys",new JArray(propertyNames))); o.WriteTo(writer); } } public override object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer) { throw new NotImplementedException(); } public override bool CanRead { get { return false; } } public override bool CanConvert(Type objectType) { return _types.Any(t => t == objectType); } } 资料来源:https://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |