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)
有没有办法确保username和apitoken键以小写形式出现?
我不想简单地通过运行它String.ToLower(),当然,因为价值观username和apitoken是混合的情况.
我意识到我可以以编程方式执行此操作并手动创建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,则可以使用CamelCasePropertyNamesContractResolver默认包含的Newtonsoft.Json库.
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)
笔记 -
使用string.ToLowerInvariant()确保在所有语言环境中生成相同的合同.
为了控制覆盖的属性名称,字典键和扩展数据名称是否小写,你可以设置NamingStrategy.OverrideSpecifiedNames,NamingStrategy.ProcessDictionaryKeys或NamingStrategy.ProcessExtensionDataNames(Json.NET 10.0.1及更高版本)true.
您可能希望缓存合同解析程序以获得最佳性能.
如果您无权访问框架中的序列化程序设置,则可以NamingStrategy按如下方式直接应用于对象:
[JsonObject(NamingStrategyType = typeof(LowercaseNamingStrategy))]
public class Authority
{
public string Username { get; set; }
public string ApiToken { get; set; }
}
Run Code Online (Sandbox Code Playgroud)不要修改NamingStrategy的CamelCasePropertyNamesContractResolver.此合约解析程序在其所有实例中全局共享类型信息,因此修改任何一个实例可能会产生意外的副作用.
小智 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)
| 归档时间: |
|
| 查看次数: |
48566 次 |
| 最近记录: |