我有一个分布式系统,其中包含挪威语的类/字段名称,我试图将其映射到英语。通过MSMQ发送的消息使用JSON.Net作为JSON发送。我有包含序列化对象的消息,其类型最初是挪威语,序列化为例如:
{ "$type": MyNamespace.Navn }
代码重命名后,现在将此相同类型重命名为Name
,这是Navn的翻译。
是否可以配置JSON.Net,在反序列化该JSON时,它会知道虽然$type
是MyNamespace.Navn
,但它现在应该反序列化为MyNamespace.Name
类型?
(注意:这也与这个回答的问题有关 - Mapping multiple property names to the same field in Newtonsoft.JSON)
答案 0 :(得分:0)
JSON.Net允许设置自定义SerializationBinder以涵盖此类方案。这是一个示例:
public class ReplaceOldTypesBinder : ISerializationBinder
{
public Type BindToType(string assemblyName, string typeName)
{
// Put your logic for replacing type here
if (assemblyName == "ConsoleApplication" && typeName == "ConsoleApplication.OldType")
{
return typeof(NewType);
}
return Type.GetType(typeName);
}
public void BindToName(Type serializedType, out string assemblyName, out string typeName)
{
throw new NotImplementedException();
}
}
反序列化:
var deserializationSettings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All,
SerializationBinder = new ReplaceOldTypesBinder(),
};
var deserialized = JsonConvert.DeserializeObject(json, deserializationSettings);