在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 }
您也可以使用这些配置进行自动部署,这将节省您的时间。