Ensuring json keys are lowercase in .NET

在.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键都是小写的?

I don't want to simply run it through String.ToLower() of course because the values for username and apitoken are mixed case.

我意识到我可以通过编程的方式创建 JSON 字符串,但是我需要大约20个 JSON 数据字符串,我想看看我是否可以节省一些时间。我想知道是否有任何已经构建的库允许您在创建密钥时强制使用小写。

72152 次浏览

您可以为此创建自定义契约解析器。下面的契约解析器将把所有键转换为小写:

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" }

NET MVC4/WebAPI

如果你使用的是 ASP.NET MVC4/WebAPI,你可以使用来自 Newtonsoft 的 CamelCasePropertyNamesContractResolver。默认包含的 Json 库。

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

你可以使用“ 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);

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

Define LowercaseNamingStrategy as follows:

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

注释 -

对我来说,我使用了其他一些答案的组合,并以此结束

        return JsonConvert.SerializeObject(obj, Formatting.Indented, new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
});

更接近于我所寻找的解决方案,因为我并不打算创造自己的