O Json.NET desserializa ou serializa a propriedade json e mapeia propriedades para diferentes nomes de propriedades definidos em tempo de execução
Eu tenho a seguinte string JSON:
{
"values": {
"details": {
"property1": "94",
"property2": "47",
"property3": "32",
"property4": 1
},
count: 4
}
}
Vou mapear isso para o seguinte modelo:
public class Details
{
public string property1 { get; set; }
public string property2 { get; set; }
public string property3 { get; set; }
public int property4 { get; set; }
}
public class Values
{
public Details details { get; set; }
public int count { get; set; }
}
public class RootObject
{
public Values values { get; set; }
}
Eu quero ser capaz de mapear esses nomes de propriedades para nomes diferentes em tempo de execução ao desserializar essa string JSON assim:
JsonConvert.DeserializeObject<RootObject>(jsonString);
Por exemplo, no processo de desserialização, desejo desserializar o nome de "property1" para "differen_property_name1" ou "differen_property_name2" ou "differen_property_name3". PorqueEstou escolhendo o novo nome em tempo de execução (o novo nome para o qual alterarei o nome "property1"), não posso usar a solução usando JsonPropertyAttribute, conforme sugerido aqui:
O JSON do .NET NewtonSoft desserializa o mapa para um nome de propriedade diferente
Uma das respostas da pergunta acima (resposta de Jack) usa a herança de DefaultContractResolver, mas não parece funcionar nesse caso.
Atualizar
Mais tarde, precisei serializar o objeto que obtive da desserialização e mapear as propriedades para diferentes nomes de propriedades, definidos em tempo de execução. Eu usei o mesmo método que Brian propôs para fazer a serialização:
Usei o dicionário para mapear meus novos nomes de propriedades:
var map = new Dictionary<Type, Dictionary<string, string>>
{
{
typeof(Details),
new Dictionary<string, string>
{
{"property1", "myNewPropertyName1"},
{"property2", "myNewPropertyName2"},
{"property3", "myNewPropertyName3"},
{"property4", "myNewPropertyName4"}
}
}
};
e então usei o DynamicMappingResolver de Brian para serializar o objeto assim:
var settings = new JsonSerializerSettings
{
ContractResolver = new DynamicMappingResolver(map)
};
var root = JsonConvert.SerializeObject(myObjectInstance, settings);