笔记:Newtonsoft.Json 自定义一个根据typeconverter转换的JsonConverter

        在 Newtonsoft.Json 中创建一个根据 TypeConverter 转换的 JsonConverter 允许你在序列化和反序列化过程中利用 .NET 的 TypeConverter 机制。这种方式特别有用,当你想要为不直接支持 JSON 序列化的类型提供自定义的序列化逻辑时,比如第三方库中的类型或者特殊的数据结构。
下面是一个示例,展示如何实现这样一个 JsonConverter:


1.    定义 TypeConverterJsonConverter 类


这个自定义的 JsonConverter 将检查目标类型是否有一个 TypeConverter,该 TypeConverter 能够将对象转换为字符串,反之亦然。如果有,它将使用这个 TypeConverter 来进行序列化和反序列化。

public class TypeConverterJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        // 检查是否存在能够转换到字符串和从字符串转换回来的 TypeConverter
        TypeConverter converter = TypeDescriptor.GetConverter(objectType);
        return converter != null && converter.CanConvertFrom(typeof(string)) && converter.CanConvertTo(typeof(string));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
        {
            return null;
        }

        var converter = TypeDescriptor.GetConverter(objectType);
        return converter.ConvertFromInvariantString((string)reader.Value);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value == null)
        {
            writer.WriteNull();
            return;
        }

        var converter = TypeDescriptor.GetConverter(value.GetType());
        writer.WriteValue(converter.ConvertToInvariantString(value));
    }

2.    使用 TypeConverterJsonConverter


现在,你可以在序列化和反序列化时使用这个自定义的 JsonConverter。这对于那些通过 TypeConverter 可以转换为字符串和从字符串转换回来的类型特别有用。

[JsonConverter(typeof(TypeConverterJsonConverter))]
public class CustomType
{
    // 假设这个类有一个能够转换为字符串和从字符串转换回来的 TypeConverter
}

// 现在,你可以序列化和反序列化包含 CustomType 类型的对象了
CustomType myObject = new CustomType();
string json = JsonConvert.SerializeObject(myObject);

CustomType deserializedObject = JsonConvert.DeserializeObject<CustomType>(json);

注意事项


•    这个自定义 JsonConverter 假设目标类型有一个有效的 TypeConverter,能够进行到字符串和从字符串的转换。不是所有的类型都有这样的 TypeConverter,所以在使用之前请确保进行了适当的检查。
•    使用 TypeConverter 进行序列化和反序列化可能不适用于所有场景,特别是当类型的字符串表示不足以完全恢复对象状态时。在这些情况下,考虑实现更具体的序列化逻辑。
•    这种方法的优点是它提供了一种灵活的方式来支持额外的类型,而无需为每种类型编写专门的序列化逻辑。 

System.Windows.Controls 命名空间 | Microsoft Learn

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 01:52:04       3 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 01:52:04       3 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 01:52:04       2 阅读
  4. Python语言-面向对象

    2024-07-11 01:52:04       2 阅读

热门阅读

  1. C#面:解释startup class的configure方法有什么作用?

    2024-07-11 01:52:04       10 阅读
  2. 甲方安全员应该持有什么心态

    2024-07-11 01:52:04       11 阅读
  3. Memcached介绍和详解

    2024-07-11 01:52:04       11 阅读
  4. python xlsx 导出表格超链接

    2024-07-11 01:52:04       9 阅读
  5. qt 子线程更新ui举例

    2024-07-11 01:52:04       8 阅读
  6. python——解决字节转义的问题

    2024-07-11 01:52:04       9 阅读
  7. Spring源码(二) refresh () 方法

    2024-07-11 01:52:04       9 阅读