有没有简单的方法在中使用JSON.NET以确保密钥以小写形式发送?

At the moment I'm using the newtonsoft's Json.NET library and simply using

string loginRequest = JsonConvert.SerializeObject(auth);

在本例中,auth只是以下对象

public class Authority
{
    public string Username { get; set; }
    public string ApiToken { get; set; }
}

This results in

{"Username":"Mark","ApiToken":"xyzABC1234"}

有没有办法确保usernameapitoken键都是小写的?

当然,我不想简单地计算String.ToLower(),因为usernameapitoken的值大小写不一.

我意识到我可以通过编程实现这一点,并手动创建JSON字符串,但我需要大约20个JSON数据字符串,我正在考虑是否可以节省一些时间.我想知道是否有任何已经构建的库允许您强制使用小写字母创建密钥.

推荐答案

You can create a custom contract resolver for this. The following contract resolver will convert all keys to lowercase:

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 result in:

{"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();
        }
    }
}

Which can be used like this:

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

ASP.NET MVC4 / WebAPI

如果你正在使用ASP.NET MVC4/WebAPI,您可以使用Newtonsoft提供的CamelCasePropertyNamesContractResolver.默认情况下包含的Json库.

Json相关问答推荐

JOLT规范:转移到现有数组

JOLT转换,将属性复制到同级别的dict中

按照对象键的值对PostgreSQL JSONB对象进行排序'

写入JSON文件的流

Jolt 变换 - 如何用字段值重命名字段?

Powershell 7.2:ConvertFrom-Json - 日期处理

PowerShell:如何将哈希表输出为 json 并使用 foreach 循环将其存储在变量中?

为什么根据其他工具,来自 aws rds 的 JSON 在 Docker 中格式错误运行?

使用 KQL 和外部 data() 运算符从 json 文件中提取信息

将文本转换为 python 列表

将 YAML 文件转换为 Python JSON 对象

从 JSON 对象中删除键值对

如何使用 Serde 使用顶级数组反序列化 JSON?

Jackson 的@JsonView、@JsonFilter 和 Spring

苗条的 JSON 输出

Android JSON 库的性能和可用性比较

与classic 规范化表相比,postgres JSON 索引是否足够高效?

雅虎财经全币种报价 API 文档

如何从 MySQL 中检索 JSON 数据?

使用 JSON.NET 序列化/反序列化对象字典