使用 Json.NET 序列化程序对某些属性进行驼峰式大小写,但不对其他属性进行驼峰式大小写

pus*_*kin 5 c# json.net

我正在使用 Newtonsoft.JSON 序列化此格式的对象:

class Message
{
    public HeaderType Header { get; set; }
    public object Body { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想将HeaderBody属性转换为驼峰式大小写,同时保留分配给 的事物的属性的大小写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)

有没有办法忽略对象的某些部分?我看到文档调用了OverrideSpecifiedNamesProcessDictionaryKeys、 和ProcessExtensionDataNames,但看起来这不是我想要的。

我是否被迫使用某种自定义命名策略?我怎样才能实现这个目标?

Ela*_*ode 8

您可以将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)


mar*_*tch 1

您可以创建自己的解析器以这种方式运行。

您可以创建一个,可能让它寻找一个新属性(您创建的),然后您可以使用该属性来装饰您不想要驼峰式命名的属性。