将存储的具有旧类型名称的JSON文件反序列化为新类型

时间:2018-03-14 15:57:09

标签: .net json json.net

我有一个分布式系统,其中包含挪威语的类/字段名称,我试图将其映射到英语。通过MSMQ发送的消息使用JSON.Net作为JSON发送。我有包含序列化对象的消息,其类型最初是挪威语,序列化为例如:

{ "$type": MyNamespace.Navn }

代码重命名后,现在将此相同类型重命名为Name,这是Navn的翻译。

是否可以配置JSON.Net,在反序列化该JSON时,它会知道虽然$typeMyNamespace.Navn,但它现在应该反序列化为MyNamespace.Name类型?

(注意:这也与这个回答的问题有关 -  Mapping multiple property names to the same field in Newtonsoft.JSON

1 个答案:

答案 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);