一尘不染

在Newtonsoft.Json中添加多个合同解析器

json

数据结构蓝图:

public class Movie
{
    public string Name { get; set; }
}

使用Newtonsoft.Json,我具有以下用于Json序列化的配置。

var settings = new JsonSerializerSettings() { 
    ContractResolver = new CamelCasePropertyNamesContractResolver(),
};

显然,这将打印出:

{
    name: null
}

现在,我需要在JsonSerializerSettings中的ContractResolver中添加另一个NullToEmptyStringResolver,如何实现如下输出:

{
    name: ""
}
  • 请注意,我的NullToEmptyStringResolver已被编写。但是我需要将NullToEmptyStringResolver和CamelCasePropertyNamesContractResolver都添加到合同解析器中。

阅读 391

收藏
2020-07-27

共1个答案

一尘不染

Json.Net一次不允许一个以上的合同解析器,因此您将需要一种组合其行为的方法。我假设这NullToEmptyStringResolver是一个自定义解析器,它继承自Json.Net的DefaultContractResolver类。如果是这样,一种实现所需结果的简单方法是改为NullToEmptyStringResolver继承CamelCasePropertyNamesContractResolver

public class NullToEmptyStringResolver : CamelCasePropertyNamesContractResolver
{
    ...
}

如果您不喜欢这种方法,则另一个想法是将骆驼肠衣的行为添加到NullToEmptyStringResolver。如果您看一下如何CamelCasePropertyNamesContractResolver源代码中实现,您会发现这就像NamingStrategy在构造函数中设置一样简单(假设您使用的是Json.Net
9.0.1或更高版本)。您可以将相同的代码添加到的构造函数中NullToEmptyStringResolver

public class NullToEmptyStringResolver : DefaultContractResolver
{
    public NullToEmptyStringResolver() : base()
    {
        NamingStrategy = new CamelCaseNamingStrategy
        {
            ProcessDictionaryKeys = true,
            OverrideSpecifiedNames = true
        };
    }

    ...
}
2020-07-27