从T到multilingualvalue的自定义转换<在JSON.Net

本文关键字:JSON Net 转换 自定义 multilingualvalue | 更新日期: 2023-09-27 18:09:53

我有很多以前使用类型属性的实体,例如string。我需要把它们改成自定义的类型——MultilingualValue<T>,这里的T是string。我可以很容易地从string转换为自定义类型。是否可以配置JSON。Net这样的地方,它遇到从任何类型的转换,到MultilingualValue<T>,一些自定义代码被调用,而不是它的本机转换?

示例代码
public class ProductBefore
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class ProductAfter
{
    public int Id { get; set; }
    public MultilingualValue<string> Name { get; set; }
}

我希望能够将任何存储为ProductBefore的内容自动反序列化为ProductAfterMultilingualValue<string>可以在构造函数中使用string参数初始化,因此从原始string创建它相对容易。

从T到multilingualvalue的自定义转换<在JSON.Net

可以通过添加自定义Converter。这些可以按以下方式添加:

    private void createJsonSerializer()
    {
        JsonSerializerSettings settingsSerialize = new JsonSerializerSettings();
        settingsSerialize.Converters.Add(CustomConverter.Instance);
        _jsonSeriazlier = Newtonsoft.Json.JsonSerializer.Create(settingsSerialize);
    }

以防万一它对任何人都有帮助,下面是自定义转换器本身:

    public class CustomConverter : JsonConverter
    {
        public CustomConverter()
        {

        }
        public override bool CanWrite
        {
            get { return false; }
        }
        private static readonly CustomConverter _instance = new CustomConverter();
        public static CustomConverter Instance
        {
            get { return _instance; }
        }
        public override bool CanConvert(Type objectType)
        {
            return (objectType.IsAssignableFrom(typeof(MultilingualValue<MultilingualValueMetaData<string>>)));
        }
           public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
           {
               MultilingualValue<MultilingualValueMetaData<string>> result = new MultilingualValue<MultilingualValueMetaData<string>>();
               JsonToken firstToken = reader.TokenType;
               reader.Read();//skip first Token
               while (reader.TokenType != JsonToken.EndObject)
               {
                   string languageType = (string) reader.Value;
                   reader.Read();
                   MultilingualValueMetaData<string> metaData = null;
                   if (reader.TokenType == JsonToken.StartObject)
                   {
                       metaData = serializer.Deserialize<MultilingualValueMetaData<string>>(reader);
                   }
                   else
                   {
                       metaData = new MultilingualValueMetaData<string>();
                       metaData.AutoTranslation = (string) reader.Value;

                   }
                   result[languageType] = metaData;
                   reader.Read();
               }
               return result;

           }
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {

        }
    }