加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:53:00 所属栏目:百科 来源:网络整理
导读:使用Newtonsoft.Json时,我可以通过向顶级SerializerSettings添加转换器或将其提供给转换调用来实现我所需要的 – 一切运行良好. 我希望提取一些全局转换器,而不是在实际需要转换的相关位置以声明方式应用. 我知道以下技巧: – 类型级别[JsonConverter(typeo
使用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读