0

たとえば、以前はタイプのプロパティを持っていたエンティティがたくさんありますstring。これらをカスタム タイプ - に変更する必要がありMultilingualValue<T>ます。この場合の T はstringです。stringからカスタム Type に簡単に変換できます。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です。

4

1 に答える 1

0

Custom を追加することで可能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)
        {



        }
    }
于 2013-04-18T11:31:59.027 に答える