一尘不染

确保JSON键在.NET中为小写

json

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

目前,我正在使用newtonsoft的Json.NET库,并且仅使用

string loginRequest = JsonConvert.SerializeObject(auth);

在这种情况下auth只是以下对象

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

这导致

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

有没有办法确保usernameapitoken键都以小写形式通过?

我不想简单地通过运行它String.ToLower(),当然,因为价值观usernameapitoken是混合的情况。

我意识到我可以以编程方式执行此操作并手动创建JSON字符串,但是我需要大约20个左右的JSON数据字符串,并且正在查看是否可以节省一些时间。我想知道是否有任何已经建立的库可以让您强制小写密钥创建。


阅读 224

收藏
2020-07-27

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

威尔导致:

{"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,则可以使用CamelCasePropertyNamesContractResolverNewtonsoft.Json库中的默认库。

2020-07-27