在c#中覆盖Json属性名称

我有一个包含以下字段的课程。 当需要调用外部rest API方法时,这些属性用于序列化为json对象。

public class Customer { [JsonProperty(PropertyName = "email")] public string Email { get; set; } [JsonProperty(PropertyName = "prop[listId]")] public string Test{ get; set; } // there are lot of properties } 

在属性名称Test ,外部API服务调用需要遵循json文件名格式。

 prop[7] 

在我的情况下,这7可以根据test,dev和prod等环境进行更改。所以我正在寻找一种方法将listId值移动到app.config中。

我试图按照以下方式执行此操作,但不允许这样做。对于listIdValue如果分配常量值,它将起作用。

  private string listIdValue = ConfigurationManager.AppSettings["ListIdValue"]; [JsonProperty(PropertyName = "prop["+listIdValue +"]")] public string Test{ get; set; } 

您必须覆盖DefaultContractResolver并实现自己的机制来提供PropertyName (以JSON格式)。 我将提供一个完整的示例代码,以使用运行时生成的PropertyName显示反序列化和序列化。 目前,它将Test字段修改为Test5 (在所有模型中)。 您应该实现自己的机制(使用属性,保留名称,表或其他。

 class Program { static void Main(string[] args) { var customer = new Customer() {Email = "asd@asd.com", Test = "asdasd"}; var a = Serialize(customer, false); var b = Serialize(customer, true); Console.WriteLine(a); Console.WriteLine(b); var desA = Deserialize(a, false); var desB = Deserialize(b, true); Console.WriteLine("TestA: {0}", desA.Test); Console.WriteLine("TestB: {0}", desB.Test); } static string Serialize(object obj, bool newNames) { JsonSerializerSettings settings = new JsonSerializerSettings(); settings.Formatting = Formatting.Indented; if (newNames) { settings.ContractResolver = new CustomNamesContractResolver(); } return JsonConvert.SerializeObject(obj, settings); } static T Deserialize(string text, bool newNames) { JsonSerializerSettings settings = new JsonSerializerSettings(); settings.Formatting = Formatting.Indented; if (newNames) { settings.ContractResolver = new CustomNamesContractResolver(); } return JsonConvert.DeserializeObject(text, settings); } } class CustomNamesContractResolver : DefaultContractResolver { protected override IList CreateProperties(System.Type type, MemberSerialization memberSerialization) { // Let the base class create all the JsonProperties // using the short names IList list = base.CreateProperties(type, memberSerialization); // Now inspect each property and replace the // short name with the real property name foreach (JsonProperty prop in list) { if (prop.UnderlyingName == "Test") //change this to your implementation! prop.PropertyName = "Test" + 5; } return list; } } public class Customer { [JsonProperty(PropertyName = "email")] public string Email { get; set; } public string Test { get; set; } } 

输出:

 { "email": "asd@asd.com", "Test": "asdasd" } { "email": "asd@asd.com", "Test5": "asdasd" } TestA: asdasd TestB: asdasd 

如您所见,当我们使用Serialize(..., false) – 字段的名称为Test ,当我们使用Serialize(..., true) – 字段的名称为Test5 ,如预期的那样。 这也适用于反序列化。

我使用这个答案作为我的答案的检查: https ://stackoverflow.com/a/20639697/773879

定义不同的配置模式,如Debug / Release / QA / Staging

然后为每一个添加编译符号。 并在您的代码中,您执行以下操作:

以下我假设您定义:QA和STAGING

 public class Customer { [JsonProperty(PropertyName = "email")] public string Email { get; set; } #if QA [JsonProperty(PropertyName = "prop[QA_ID]")] #elif STAGING [JsonProperty(PropertyName = "prop[STAGING_ID]")] #endif public string Test{ get; set; } // there are lot of properties } 

您也可以使用这些配置进行自动部署,这将节省您的时间。