我有很多以前曾经拥有类型属性的实体,例如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
创建它相对容易。
答案 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)
{
}
}