Sobrescrever o nome da propriedade Json em c #

Eu tenho uma turma com os seguintes campos. Essas propriedades são usadas para serializar como object json quando ele precisa chamar um método de API de descanso externo.

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 } 

No nome da propriedade Test , a chamada de serviço de API externa exigia alguma coisa como seguir o formato de nome do arquivo json.

 prop[7] 

No meu caso, este 7 pode ser alterado de acordo com o ambiente, como teste, dev e prod.So o que eu estou procurando uma maneira de mover esse valor listId em app.config.

Eu tentei fazê-lo como segue, mas não é permitido fazer isso. Para o listIdValue se atribuir o valor constante ele funcionará.

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

Você terá que replace o DefaultContractResolver e implementar seu próprio mecanismo para fornecer o PropertyName (em JSON). Fornecerei um código de exemplo completo para mostrar a desserialização e a serialização com um PropertyName gerado em tempo de execução. Atualmente, ele modifica o campo Test para Test5 (em todos os modelos). Você deve implementar seu próprio mecanismo (usando um atributo, um nome reservado, uma tabela ou qualquer outra coisa.

 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; } } 

Saída:

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

Como você vê, quando usamos Serialize(..., false) – o nome do campo é Test e quando usamos Serialize(..., true) – o nome do campo é Test5 , como esperado. Isso também funciona para desserialização.

Eu usei essa resposta como inspiração para minha resposta: https://stackoverflow.com/a/20639697/773879

Definir diferentes modos de configuração, como Debug / Release / QA / Staging

Em seguida, adicione símbolos de compilation para cada um deles. e no seu código você faz algo como:

A seguir, suponho que você tenha definido: QA e 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 } 

Você também pode usar essas configurações para implantação automatizada, o que economizará tempo.