Обеспечение 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); 
  • JSON.Net: принудительная сериализация всех частных полей и всех полей в подclassах
  • Web API 2: как вернуть JSON с именами свойств camelCased, на объекты и их под-объекты
  • Как написать Json-файл в C #?
  • Как разобрать объект JSON на C #, если я заранее не знаю ключ?
  • .NET NewtonSoft JSON десериализует карту для другого имени свойства
  • Сериализация типа Json.Net с полиморфным дочерним объектом
  • Линейная сериализация и де-сериализация
  • Json.Net: свойство Serialize / Deserialize в качестве значения, а не как объект
  • Установка стандартного JSON-сериализатора в ASP.NET MVC
  • Как игнорировать неизвестные значения enum во время десериализации json?
  • Как обрабатывать как отдельный элемент, так и массив для одного и того же свойства с помощью JSON.net
  • Interesting Posts

    Как получить клавиатуру с кнопками Next, Previous и Done?

    .NET. Получить протокол, хост и порт.

    Как «застегнуть» или «повернуть» переменное количество списков?

    Задержка анимации CSS в повторении

    Какой шрифт используется в этом изображении?

    MySql суммирует элементы столбца

    Большой запрос веб-службы WCF с ошибкой (400) Ошибка HTTP-запроса

    импорт библиотек jar в андроид-студию

    SwingWorker, done () выполняется до завершения вызовов ()

    Событие запуска приложения WCF

    Java EE веб-разработки, где я начинаю и какие навыки мне нужны?

    Не удалось добавить оконный токен android.os.BinderProxy недействителен; работает ли ваша деятельность?

    Как автоматически установить USB-накопитель, на который все пользователи могут писать?

    Преобразование кассетной записи в цифровой формат

    ошибка LNK2038: обнаружено несоответствие для «_MSC_VER»: значение «1600» не соответствует значению «1700» в CppFile1.obj

    Давайте будем гением компьютера.