确保json密钥在.NET中是小写的

Mar*_*ark 95 .net json json.net

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

目前我正在使用newtonsoft的Json.NET库并且只是使用

string loginRequest = JsonConvert.SerializeObject(auth);
Run Code Online (Sandbox Code Playgroud)

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

public class Authority
{
    public string Username { get; set; }
    public string ApiToken { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这导致了

{"Username":"Mark","ApiToken":"xyzABC1234"}
Run Code Online (Sandbox Code Playgroud)

有没有办法确保usernameapitoken键以小写形式出现?

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

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

ale*_*exn 169

您可以为此创建自定义合约解析程序.以下合约解析程序会将所有键转换为小写:

public class LowercaseContractResolver : DefaultContractResolver
{
    protected override string ResolvePropertyName(string propertyName)
    {
        return propertyName.ToLower();
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var settings = new JsonSerializerSettings();
settings.ContractResolver = new LowercaseContractResolver();
var json = JsonConvert.SerializeObject(authority, Formatting.Indented, settings);
Run Code Online (Sandbox Code Playgroud)

Wil导致:

{"username":"Mark","apitoken":"xyzABC1234"}
Run Code Online (Sandbox Code Playgroud)

如果您总是想要使用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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

哪个可以这样使用:

var json = LowercaseJsonSerializer.SerializeObject(new { Foo = "bar" });
// { "foo": "bar" }
Run Code Online (Sandbox Code Playgroud)

ASP.NET MVC4/WebAPI

如果您使用的是ASP.NET MVC4/WebAPI,则可以使用CamelCasePropertyNamesContractResolver默认包含的Newtonsoft.Json库.

  • `CamelCasePropertyNamesContratResolver`不会以小写形式转换属性,只是第一个char. (9认同)
  • 看来,这个自定义契约解析器没有考虑JsonProperty属性,如果你想指定异常......例如[JsonProperty("alternateName")]仍然是小写的,还是有另一种方法可以做到这一点? (3认同)
  • 用于指出`CamelCasePropertyNamesContractResolver`的+1.现在我发现`System.Net.Http.Formatting.JsonContractResolver`是WebAPI中的默认值,这个类是内部的.我最终用camel case重写`JsonContractResolver`.有人报告这是公开的https://aspnetwebstack.codeplex.com/workitem/228 (2认同)

Sag*_*agi 22

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();
    }
}
Run Code Online (Sandbox Code Playgroud)


dbc*_*dbc 10

Json.NET 9.0.1及更高版本中,可以通过使用自定义确保将所有属性名称转换为小写NamingStrategy.此类提取逻辑,用于将属性名称的算法重新映射从合约解析程序转换为可以设置的单独轻量级对象DefaultContractResolver.NamingStrategy.这样做可以避免创建自定义ContractResolver的需要,因此可以更容易地集成到已经拥有自己的合同解析器的框架中.

定义LowercaseNamingStrategy如下:

public class LowercaseNamingStrategy : NamingStrategy
{
    protected override string ResolvePropertyName(string name)
    {
        return name.ToLowerInvariant();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后序列化如下:

var settings = new JsonSerializerSettings
{
    ContractResolver = new DefaultContractResolver { NamingStrategy = new LowercaseNamingStrategy() },
};
string loginRequest = JsonConvert.SerializeObject(auth, settings);
Run Code Online (Sandbox Code Playgroud)

笔记 -


小智 6

您可以使用“ 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);
Run Code Online (Sandbox Code Playgroud)