Обеспечение json-ключей в .NET

Есть ли простой способ использования JSON в .NET, чтобы гарантировать, что ключи отправляются как строчные буквы?

На данный момент я использую библиотеку Json.NET newtonsoft и просто использую

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, и я вижу, смогу ли я сэкономить некоторое время. Мне интересно, есть ли уже построенные библиотеки, которые позволяют вам вводить строчные буквы для создания ключей.

Для этого вы можете создать собственный пользовательский разрешитель. Следующий контрактный преобразователь преобразует все ключи в нижний регистр:

 public class LowercaseContractResolver : DefaultContractResolver { protected override string ResolvePropertyName(string propertyName) { return propertyName.ToLower(); } } 

Применение:

 var settings = new JsonSerializerSettings(); settings.ContractResolver = new LowercaseContractResolver(); var json = JsonConvert.SerializeObject(authority, Formatting.Indented, settings); 

Wil приводит к:

 {"username":"Mark","apitoken":"xyzABC1234"} 

Если вы всегда хотите сериализоваться с помощью метода LowercaseContractResolver , рассмотрите возможность его переноса в class, чтобы избежать повторения:

 public class LowercaseJsonSerializer { private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings { ContractResolver = new LowercaseContractResolver() }; public static string SerializeObject(object o) { return JsonConvert.SerializeObject(o, Formatting.Indented, Settings); } public class LowercaseContractResolver : DefaultContractResolver { protected override string ResolvePropertyName(string propertyName) { return propertyName.ToLower(); } } } 

Что можно использовать следующим образом:

 var json = LowercaseJsonSerializer.SerializeObject(new { Foo = "bar" }); // { "foo": "bar" } 

ASP.NET MVC4 / WebAPI

Если вы используете ASP.NET MVC4 / WebAPI, вы можете использовать CamelCasePropertyNamesContractResolver из библиотеки Newtonsoft.Json, которая включена по умолчанию.

 protected void Application_Start() { JsonConfig.Configure(); } public static class JsonConfig { public static void Configure(){ var formatters = GlobalConfiguration.Configuration.Formatters; var jsonFormatter = formatters.JsonFormatter; var settings = jsonFormatter.SerializerSettings; settings.ContractResolver = new CamelCasePropertyNamesContractResolver(); } } 

В Json.NET 9.0.1 и более поздних версиях можно гарантировать, что все имена свойств преобразуются в нижний регистр с помощью пользовательской NamingStrategy . Этот class извлекает логику алгоритмического переназначения имен свойств из распознавателя контрактов на отдельный, легкий объект, который можно установить в DefaultContractResolver.NamingStrategy . Это позволяет избежать необходимости создания пользовательского ContractResolver и, следовательно, может быть проще интегрироваться в структуры, у которых уже есть свои собственные решатели контрактов.

Определите LowercaseNamingStrategy следующим образом:

 public class LowercaseNamingStrategy : NamingStrategy { protected override string ResolvePropertyName(string name) { return name.ToLowerInvariant(); } } 

Затем выполните сериализацию следующим образом:

 var settings = new JsonSerializerSettings { ContractResolver = new DefaultContractResolver { NamingStrategy = new LowercaseNamingStrategy() }, }; string loginRequest = JsonConvert.SerializeObject(auth, settings); 

Заметки –

  • Использование string.ToLowerInvariant() гарантирует, что один и тот же контракт создается во всех локалях.

  • Чтобы NamingStrategy.OverrideSpecifiedNames , переопределены ли имена свойств, словарные ключи и имена данных расширения, вы можете установить значение NamingStrategy.OverrideSpecifiedNames , NamingStrategy.ProcessDictionaryKeys или NamingStrategy.ProcessExtensionDataNames (Json.NET 10.0.1 и новее) в true .

  • Вы можете захотеть кэшировать распознаватель контракта для достижения наилучшей производительности .

  • Если у вас нет доступа к параметрам сериализатора в вашей структуре, вы можете применить NamingStrategy непосредственно к вашему объекту следующим образом:

     [JsonObject(NamingStrategyType = typeof(LowercaseNamingStrategy))] public class Authority { public string Username { get; set; } public string ApiToken { get; set; } } 
  • Не изменяйте NamingStrategy of CamelCasePropertyNamesContractResolver . Этот разрешитель контракта делится информацией о типе по всему миру во всех своих экземплярах, поэтому изменение любого экземпляра может иметь неожиданные побочные эффекты.

вы можете использовать «JsonProperty»:

Применение:

 public class Authority { [JsonProperty("userName")] // or [JsonProperty("username")] public string Username { get; set; } [JsonProperty("apiToken")] // or [JsonProperty("apitoken")] public string ApiToken { get; set; } } var json = JsonConvert.SerializeObject(authority); 
  • Обнаружен цикл саморегуляции - Возврат данных из WebApi в браузер
  • Могу ли я сериализовать вложенные свойства в мой class за одну операцию с помощью Json.net?
  • Конвенция о присвоении имен JSON
  • Ошибка JSON.NET Локальный цикл привязки для типа
  • json.net: указать конвертер для ключей словаря
  • Удалить дескриптор объекта json в динамический объект с помощью Json.net
  • JToken: получить исходное / оригинальное значение JSON
  • Deserialize json, который имеет некоторое имя свойства, начиная с числа
  • Ошибка при запуске JSON.NET при сериализации Mongo ObjectId
  • Как установить Json.Net в качестве сериализатора по умолчанию для службы WCF REST
  • Разбор JSON в C #
  • Давайте будем гением компьютера.