使用Newtonsoft.Json时,我可以通过向顶级SerializerSettings添加转换器或将其提供给转换调用来实现我所需要的 – 一切运行良好.
我希望提取一些全局转换器,而不是在实际需要转换的相关位置以声明方式应用.
我知道以下技巧: –
>类型级别[JsonConverter(typeof(Converters.StringEnumConverter))]直接在类型X上
>成员级别[JsonConverter(typeof(Converters.StringEnumConverter))] iff成员类型为X
> item level [JsonProperty(ItemConverterType = 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