.net, обеспечивающий json-ключи в нижнем регистре
Привет всем, есть простой способ использования json в .Net, чтобы гарантировать, что ключи отправляются как строчные.
В настоящий момент я использую библиотеку newtonsoft.json и просто использую
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(), конечно, потому что значения для имени пользователя и apitoken являются смешанным случаем.
Я понимаю, что могу программировать это и создать строку json вручную, но мне нужно это примерно за примерно двадцать строк данных json и посмотреть, могу ли я сэкономить некоторое время. Подумайте, есть ли уже созданные библиотеки, которые позволяют вам вводить строчные буквы для создания ключей.
Ответы
Ответ 1
Для этого вы можете создать собственный пользовательский разрешитель. Следующий преобразователь контракта преобразует все ключи в нижний регистр:
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
, рассмотрите возможность его переноса в класс, чтобы избежать повторения:
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, которая включена по умолчанию.
Ответ 2
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();
}
}
Ответ 3
В Json.NET 9.0.1 и позже можно гарантировать, что все имена свойств преобразуются в нижний регистр с помощью пользовательского NamingStrategy
. Этот класс извлекает логику алгоритмического переназначения имен свойств из распознавателя контракта в отдельный, легкий объект, который можно установить на DefaultContractResolver.NamingStrategy
.
Это позволяет избежать необходимости создавать custom 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);
Примечания -
Ответ 4
вы можете использовать "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);