c# - 在 Newtonsoft.Json 中添加多个合约解析器

标签 c# json json.net

数据结构蓝图:

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 添加到 Contract Resolver。

最佳答案

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

public class NullToEmptyStringResolver : CamelCasePropertyNamesContractResolver
{
    ...
}

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

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

    ...
}

关于c# - 在 Newtonsoft.Json 中添加多个合约解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39612636/

相关文章:

c# - 使用 FileSystem.DeleteDirectory 将多个目录发送到回收站

javascript - Highstock 日期时间 xAxis,只能显示全部。没有变焦

json - Twitter JSON 到 Google Spreadsheet API - 1. 导入和读取 JSON 文件

c# - 如何覆盖默认 JsonConverter(在属性中指定)

c# - Json 序列化没有关系的 EF 对象

c# - 将列表转换为 DataGridView

C# 4.0,可选参数和 params 不能一起工作

c# - 如何在以抽象类为根的树层次结构中更正实现 ICloneable?

php - 使用 PHP/MySQL 构建更多维的 JSON 对象

c# - 在 C# json 对象序列化和数据契约中包装原始类型