从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
的内容自动反序列化为ProductAfter
。MultilingualValue<string>
可以在构造函数中使用string
参数初始化,因此从原始string
创建它相对容易。
可以通过添加自定义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)
{
}
}