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

questionAnswers(4)

yourAnswerToTheQuestion