在JSON.Net </t>中从T自定义转换为MultilingualValue <t>

时间:2013-04-18 08:35:09

标签: c# json.net

我有很多以前曾经拥有类型属性的实体,例如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的任何内容反序列化为ProductAfter。可以使用构造函数中的MultilingualValue<string>参数初始化string,因此从原始string创建它相对容易。

1 个答案:

答案 0 :(得分:0)

可以通过添加自定义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)
        {



        }
    }