C# 使用Json.NET序列化程序对某些属性(而不是其他属性)进行CAME大小写

C# 使用Json.NET序列化程序对某些属性(而不是其他属性)进行CAME大小写,c#,json.net,C#,Json.net,我正在使用Newtonsoft.JSON序列化此格式的对象: class Message { public HeaderType Header { get; set; } public object Body { get; set; } } 我想将标题和正文属性转换为驼峰大小写,同时显示分配给正文的对象属性的大小写 因此,如果消息看起来像: var result = new Message() { Header = myHeader, Body = new SomeClass(

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

class Message
{
    public HeaderType Header { get; set; }
    public object Body { get; set; }
}
我想将
标题
正文
属性转换为驼峰大小写,同时显示分配给
正文
的对象属性的大小写

因此,如果消息看起来像:

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()
    }
});
有没有办法忽略对象的某些部分?我知道这是我的要求,但看起来这不是我想要的


我是否被迫使用某种自定义命名策略?如何实现这一点?

您可以创建自己的冲突解决程序来实现这一点


您可以创建一个,可能让它查找一个新属性(您要创建的),然后您可以使用它来装饰您不希望使用camelCased的属性。

您可以配置一个
CamelCaseNamingStrategy
以避免使用属性指定名称的camelcase属性,请查看文档

指定属性名称,如下所示

[JsonProperty(PropertyName = "Name")]
public string Name{ get; set; }
{
  "header": {
    "myPropertyA": "AAA",
    "myPropertyB": "BBB"
  },
  "body": {
    "ObjectPropertyA": "Value A",
    "ObjectPropertyB": "Value B",
    "ObjectPropertyC": "Value C"
  }
}
CamelCaseNamingStrategy
set
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; }
}
您的结果应如下所示

[JsonProperty(PropertyName = "Name")]
public string Name{ get; set; }
{
  "header": {
    "myPropertyA": "AAA",
    "myPropertyB": "BBB"
  },
  "body": {
    "ObjectPropertyA": "Value A",
    "ObjectPropertyB": "Value B",
    "ObjectPropertyC": "Value C"
  }
}

我不希望
Body
上的任何属性都是驼峰式的。如果我能帮忙的话,我宁愿不要强迫每个人都把他们的财产归为属性。例如,您可以将命名策略配置为类的属性,如(强制默认值)和(强制大小写)所示。这就是您想要的吗?
OverrideSpecifiedNames
默认设置为false。其次,我正在寻找一种解决方案,不必使用
JsonProperty
为每个属性赋予属性。想象一下,
Body
的价值来自上帝知道的地方,而我却无法获得它。我一直在寻找一个更通用的解决方案,使
Body
中的每个属性都不会变成驼峰大小写。它排除了一个类的所有道具。在我的例子中,我有一个名为
Body
的属性,我想排除它的所有属性。看起来该属性应用于整个类。我希望所有内容都是camelcased,除了
正文中的属性
。您将
标题
更改为字符串,但在我的示例中不是。这是一个对象,我仍然想用驼峰来计算它的属性。这个答案救了我,而且显然很罕见,在搜索了一个小时的NamingStrategy排除项后,花了很长时间才找到它