通过Attributes指定的转换器等同于json.net中的全局转换器

前端之家收集整理的这篇文章主要介绍了通过Attributes指定的转换器等同于json.net中的全局转换器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用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

猜你在找的Json相关文章