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