Есть ли простой способ использовать JSON в .NET, чтобы гарантировать, что ключи отправляются в нижнем регистре?
На данный момент я использую библиотеку newtonsoft Json.NET и просто использую
string loginRequest = JsonConvert.SerializeObject(auth);
В данном случае auth
это как раз следующий объект
public class Authority
{
public string Username { get; set; }
public string ApiToken { get; set; }
}
Это приводит к
{"Username":"Mark","ApiToken":"xyzABC1234"}
Есть ли способ , чтобы гарантировать , что username
и apitoken
ключи поставляются через в нижнем регистре?
Я, конечно, не хочу просто прогонять его, String.ToLower()
потому что значения для username
и apitoken
имеют смешанный регистр.
Я понимаю, что могу сделать это программно и создать строку JSON вручную, но мне это нужно примерно для 20 или около того строк данных JSON, и я смотрю, смогу ли я сэкономить время. Мне интересно, есть ли какие-нибудь уже созданные библиотеки, которые позволяют применять строчные буквы для создания ключей.
Ответы:
Для этого вы можете создать собственный преобразователь контрактов. Следующий преобразователь контрактов преобразует все ключи в нижний регистр:
Использование:
Результатом будет:
Если вы всегда хотите сериализовать с помощью
LowercaseContractResolver
, подумайте о том, чтобы обернуть его в класс, чтобы не повторяться:Что можно использовать так:
ASP.NET MVC4 / WebAPI
Если вы используете ASP.NET MVC4 / WebAPI, вы можете использовать
CamelCasePropertyNamesContractResolver
библиотеку Newtonsoft.Json, которая включена по умолчанию.источник
CamelCasePropertyNamesContractResolver
. Я обнаружил,System.Net.Http.Formatting.JsonContractResolver
что это значение по умолчанию в WebAPI, и этот класс является внутренним. Я заканчиваю перезаписьJsonContractResolver
с помощью верблюжьего корпуса. Кто-то сообщил, что это общедоступно aspnetwebstack.codeplex.com/workitem/228CamelCasePropertyNamesContratResolver
не преобразовывайте свойства в нижний регистр, только первый символ.источник
В Json.NET 9.0.1 и более поздних версиях можно обеспечить преобразование имен всех свойств в нижний регистр с помощью пользовательского
NamingStrategy
. Этот класс извлекает логику для алгоритмического переназначения имен свойств из преобразователя контракта в отдельный легкий объект, который может быть установленDefaultContractResolver.NamingStrategy
. Это избавляет от необходимости создавать пользовательские настройкиContractResolver
и, таким образом, может быть проще интегрировать в структуры, у которых уже есть свои собственные преобразователи контрактов.Определите
LowercaseNamingStrategy
следующее:Затем выполните сериализацию следующим образом:
Ноты -
Использование
string.ToLowerInvariant()
гарантирует, что один и тот же контракт будет создан во всех регионах.Для того, чтобы контролировать ли строчные имена переопределены собственности, ключи словаря и имена данных расширения, вы можете установить
NamingStrategy.OverrideSpecifiedNames
,NamingStrategy.ProcessDictionaryKeys
илиNamingStrategy.ProcessExtensionDataNames
(Json.NET 10.0.1 и позже) кtrue
.Вы можете захотеть кэшировать преобразователь контрактов для лучшей производительности .
Если у вас нет доступа к настройкам сериализатора в вашей платформе, вы можете применить
NamingStrategy
непосредственно к своему объекту следующим образом:Не изменяйте
NamingStrategy
офCamelCasePropertyNamesContractResolver
. Этот преобразователь контрактов совместно использует информацию о типах во всех своих экземплярах, поэтому изменение любого одного экземпляра может иметь неожиданные побочные эффекты.источник
вы можете использовать "JsonProperty":
Использование:
источник
Для меня я использовал комбинацию некоторых других ответов и в итоге получил это
был ближе к решению того, что я искал, поскольку я не стремился создавать свой собственный
источник