Existe uma maneira simples de usar JSON no .NET para garantir que as chaves sejam enviadas em minúsculas?
No momento estou usando a biblioteca Json.NET da newtonsoft e simplesmente usando
string loginRequest = JsonConvert.SerializeObject(auth);
Neste caso auth
é apenas o seguinte objeto
public class Authority
{
public string Username { get; set; }
public string ApiToken { get; set; }
}
Isto resulta em
{"Username":"Mark","ApiToken":"xyzABC1234"}
Existe uma maneira de garantir que as chaves username
e apitoken
sejam exibidas em minúsculas?
Não quero simplesmente repassá-lo, é String.ToLower()
claro, porque os valores para username
e apitoken
são maiúsculas e minúsculas.
Sei que posso fazer isso programaticamente e criar a string JSON manualmente, mas preciso disso para aproximadamente 20 strings de dados JSON e estou vendo se consigo economizar algum tempo. Estou me perguntando se há alguma biblioteca já construída que permite que você aplique minúsculas para a criação de chaves.
Respostas:
Você pode criar um resolvedor de contratos personalizado para isso. O seguinte resolvedor de contratos converterá todas as chaves em minúsculas:
Uso:
Resultará em:
Se você sempre deseja serializar usando o
LowercaseContractResolver
, considere envolvê-lo em uma classe para evitar a repetição:Que pode ser usado assim:
ASP.NET MVC4 / WebAPI
Se você estiver usando ASP.NET MVC4 / WebAPI, você pode usar uma
CamelCasePropertyNamesContractResolver
biblioteca de Newtonsoft.Json incluída por padrão.fonte
CamelCasePropertyNamesContractResolver
. Agora descobri queSystem.Net.Http.Formatting.JsonContractResolver
é o padrão na WebAPI e essa classe é interna. Acabo reescrevendoJsonContractResolver
com caixa de camelo. Alguém relatou que isso é público aspnetwebstack.codeplex.com/workitem/228CamelCasePropertyNamesContratResolver
não transforme as propriedades em minúsculas, apenas o primeiro caractere.fonte
No Json.NET 9.0.1 e posterior, é possível garantir que todos os nomes de propriedades sejam convertidos em minúsculas usando um personalizado
NamingStrategy
. Esta classe extrai a lógica para o remapeamento algorítmico de nomes de propriedades do resolvedor de contratos para um objeto leve e separado que pode ser definido emDefaultContractResolver.NamingStrategy
. Isso evita a necessidade de criar um customizadoContractResolver
e, portanto, pode ser mais fácil de integrar em estruturas que já têm seus próprios resolvedores de contrato.Defina
LowercaseNamingStrategy
o seguinte:Em seguida, serialize da seguinte maneira:
Notas -
Usando
string.ToLowerInvariant()
garante que o mesmo contrato seja gerado em todos os locais.Para controlar se os nomes de propriedade substituídos, chaves de dicionário e nomes de dados de extensão estão em minúsculas, você pode definir
NamingStrategy.OverrideSpecifiedNames
,NamingStrategy.ProcessDictionaryKeys
ouNamingStrategy.ProcessExtensionDataNames
(Json.NET 10.0.1 e posterior) paratrue
.Você pode querer armazenar em cache o resolvedor de contratos para melhor desempenho .
Se você não tiver acesso às configurações do serializador em sua estrutura, poderá aplicar um
NamingStrategy
diretamente ao seu objeto da seguinte maneira:Não modifique o
NamingStrategy
deCamelCasePropertyNamesContractResolver
. Este resolvedor de contratos compartilha informações de tipo globalmente em todas as suas instâncias e, portanto, a modificação de qualquer instância pode ter efeitos colaterais inesperados.fonte
você pode usar "JsonProperty":
Uso:
fonte
Para mim, usei uma combinação de algumas das outras respostas e terminei com esta
estava mais perto de uma solução para o que eu procurava, pois não procurava criar o meu próprio
fonte