将多个属性名称映射到Newtonsoft.JSON中的同一字段

将多个属性名称映射到Newtonsoft.JSON中的同一字段,json,json.net,Json,Json.net,我在分布式系统中有两个组件,它们发送使用Newtonsoft.JSON(JSON.Net)序列化/反序列化的消息 消息属性目前以挪威语发送,我希望将代码库翻译成英语。由于有一个变化,即一些消息将以挪威语发送,并由一个已升级为英语版本的组件处理,因此它需要能够同时支持这两种语言 我希望在反序列化时,“Norwegian”属性名称和英语都映射到同一个属性。例如: 例如,以英语中的“name”或挪威语中的“navn”为例 public class Message { [JsonPropert

我在分布式系统中有两个组件,它们发送使用Newtonsoft.JSON(JSON.Net)序列化/反序列化的消息

消息属性目前以挪威语发送,我希望将代码库翻译成英语。由于有一个变化,即一些消息将以挪威语发送,并由一个已升级为英语版本的组件处理,因此它需要能够同时支持这两种语言

我希望在反序列化时,“Norwegian”属性名称和英语都映射到同一个属性。例如:

例如,以英语中的“name”或挪威语中的“navn”为例

public class Message
{
     [JsonProperty("Navn")]
     public string Name { get; set;}
}
上面的问题是它只能从
Navn=>Name
映射。我希望它将
Navn
Name
映射到
Name


这在Newtonsoft.JSON中是否可用,而无需太多自定义编码

您可以在此答案中使用自定义ContractResolver:

使用[JsonProperty(“”)查找属性名称的不同变体,并返回如下属性之一:

public class Message
{
   private string _name;

   [JsonProperty("Navn" )]
   public string NorwegianName { get; set; }

   [JsonProperty("Name")]
   public string Name { 
      get { return _name ?? NorwegianName; } 
      set { _name = value; } }
}

这将返回带有JSON属性名的名称:
Navn
name

虽然这是一个选项,但我有大量的类和属性名,因此在我有数百个属性的情况下,仅为一个属性编写所有代码将非常麻烦。我更喜欢更简洁的方式,比如为同一个属性指定多个[JsonProperty]属性。然后,另一个选项是在链接的答案中使用自定义ContractResolver。它基本上使用字典将属性映射到其他名称。我看不到将多个[JsonProperty]属性分配给一个属性的方法。我要再尝试一件可能比这更干净的事情,并很快更新答案。@KarlCassar更新了答案。这将使用多个[JsonProperty],并消除对附加属性的使用。如果使用名称调用,则会得到属性名为Navn或Name的结果。但是,考虑到您有很多这样的名称,最好使用自定义ContractResolver并映射到其他属性名称。很好,这非常适合我的需要。我不喜欢ContractResolver在不同的位置使用映射。我喜欢他们接近源头,所以很明显发生了什么。