我正在使用 Newtonsoft.JSON 序列化此格式的对象:
class Message
{
public HeaderType Header { get; set; }
public object Body { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想将Header和Body属性转换为驼峰式大小写,同时保留分配给 的事物的属性的大小写Body。
因此,如果消息看起来像:
var result = new Message() { Header = myHeader, Body = new SomeClass() { A = 1 }});
Run Code Online (Sandbox Code Playgroud)
我希望输出看起来像:
{ header = myHeader, body = { A = 1 } } // I realize this isn't valid C#
Run Code Online (Sandbox Code Playgroud)
现在,我这样做是为了进行驼峰式大小写转换,但当然它会影响一切。
string stringRepresentationOfObj = JsonConvert.SerializeObject(obj, new JsonSerializerSettings {
ContractResolver = new DefaultContractResolver {
NamingStrategy = new CamelCaseNamingStrategy()
}
});
Run Code Online (Sandbox Code Playgroud)
有没有办法忽略对象的某些部分?我看到文档调用了OverrideSpecifiedNames、ProcessDictionaryKeys、 和ProcessExtensionDataNames,但看起来这不是我想要的。
我是否被迫使用某种自定义命名策略?我怎样才能实现这个目标?
您可以将CamelCaseNamingStrategy已使用属性指定名称的属性配置为非驼峰式大小写属性,请在此处查看文档
指定属性名称如下
[JsonProperty(PropertyName = "Name")]
public string Name{ get; set; }
Run Code Online (Sandbox Code Playgroud)
并且在CamelCaseNamingStrategy集合中OverrideSpecifiedNames = false
string stringRepresentationOfObj = JsonConvert.SerializeObject(obj, new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver
{
NamingStrategy = new CamelCaseNamingStrategy()
{
OverrideSpecifiedNames = false
}
}
});
Run Code Online (Sandbox Code Playgroud)
另一种方法是仅使用属性修改您的类型,JsonObject如下所示,这将强制您的类型属性仅采用驼峰命名法,并且任何嵌套属性都不会受到影响。
[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
public class ApiMessage
{
public HeaderType Header { get; set; }
public object Body { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
另外,为类添加JsonObject属性HeaderType
[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
public class HeaderType
{
public string MyPropertyA { get; set; }
public string MyPropertyB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
你的结果应该如下
{
"header": {
"myPropertyA": "AAA",
"myPropertyB": "BBB"
},
"body": {
"ObjectPropertyA": "Value A",
"ObjectPropertyB": "Value B",
"ObjectPropertyC": "Value C"
}
}
Run Code Online (Sandbox Code Playgroud)