.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);