使用Json.NET序列化程序来获取一些属性,而不是其他属性

时间:2018-05-02 22:04:28

标签: c# json.net

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

class Message
{
    public HeaderType Header { get; set; }
    public object Body { get; set; }
}

我希望将HeaderBody属性转换为驼峰大小写,同时预先设置分配给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调出了OverrideSpecifiedNamesProcessDictionaryKeysProcessExtensionDataNames,但看起来并不像我想要的那样。

我是否被迫使用某种自定义命名策略?我怎样才能做到这一点?

2 个答案:

答案 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"
  }
}