json 序列化器 NullValueHandling 不使用 datamember 属性

2023-12-11

在我的 Web api 项目中,现在我正在跳过 null 值。因此,返回 json 会忽略 null 值并打印属性。

在 Global.asax 文件中:

//manage the null in the response
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;

但是,我想用“-”替换空值。但是,我不想为每个属性使用数据成员属性......

[DefaultValue("-")]. 

我的项目中有超过 10 个类...所以,这不是最优雅的解决方案。

我希望有一个简单的解决方案并适用于任何转换,就像 Global.asax 中的空值一样

Example.

public class User
{
    public string user { get; set; }

    public string name { get; set; }

    public string dni { get; set; }
}

当所有数据都存在时,我的服务返回

{
  "user": "usertest",
  "name": "nametest",
  "dni": "123456789"
}

但是,当 dni 不存在时,响应此

{
  "user": "usertest",
  "name": "nametest",
  "dni": ""
}

所以,我想回应如下

{
  "user": "usertest",
  "name": "nametest",
  "dni": "-"
}

您可以使用自定义来处理此问题IContractResolver。解析器可以应用一个IValueProvider到每个字符串属性,然后处理将空值转换为-(如果您要反序列化相同的 JSON,则返回)。

以下是解析器所需的代码:

public class NullStringReplacementResolver : DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        IList<JsonProperty> props = base.CreateProperties(type, memberSerialization);

        // Attach a NullStringReplacementProvider instance to each string property
        foreach (JsonProperty prop in props.Where(p => p.PropertyType == typeof(string)))
        {
            PropertyInfo pi = type.GetProperty(prop.UnderlyingName);
            if (pi != null)
            {
                prop.ValueProvider = new NullStringReplacementProvider(pi);
            }
        }

        return props;
    }

    protected class NullStringReplacementProvider : IValueProvider
    {
        PropertyInfo targetProperty;

        public NullStringReplacementProvider(PropertyInfo targetProperty)
        {
            this.targetProperty = targetProperty;
        }

        // GetValue is called by Json.Net during serialization.
        // The target parameter has the object from which to read the string;
        // the return value is the string that gets written to the JSON
        public object GetValue(object target)
        {
            // if the value of the target property is null, replace it with "-"
            string s = (string)targetProperty.GetValue(target);
            return (s == null ? "-" : s);
        }

        // SetValue gets called by Json.Net during deserialization.
        // The value parameter has the original value read from the JSON;
        // target is the object on which to set the value.
        public void SetValue(object target, object value)
        {
            // if the value in the JSON is "-" replace it with null
            string s = (string)value;
            targetProperty.SetValue(target, s == "-" ? null : s);
        }
    }
}

要使用自定义解析器,您需要将其添加到JsonSerializerSettings在序列化和反序列化期间使用。如果您使用 ASP.NET Web API,则可以通过将以下内容添加到Application_Start中的方法Global.asax.cs:

var config = GlobalConfiguration.Configuration;
var settings = config.Formatters.JsonFormatter.SerializerSettings;
settings.ContractResolver = new NullStringReplacementResolver();

Fiddle: https://dotnetfiddle.net/FVA3p8

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

json 序列化器 NullValueHandling 不使用 datamember 属性 的相关文章

  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • Apache Camel 的 JsonMappingException

    我在骆驼路线上遇到以下异常 Caused by com fasterxml jackson databind JsonMappingException No serializer found for class org apache cam
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • mysql_query 保留返回时在表中创建的数据类型?

    我在mysql中有一个表 CREATE TABLE user id INT name VARCHAR 250 我查询表 result mysql query SELECT id name FROM user 我收集结果 while row
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2

随机推荐

  • 以编程方式更改 GridView 中的 ImageView

    我已经设置了带有 TextView 叠加层的 ImageView 网格 我的ImageAdapter代码如下 public View getView int position View convertView ViewGroup paren
  • 文字肖像可视化[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我停了下来 看到了这个可视化 它被称为文字肖像 我的问题是 如何做这样的事情 有描述这个的教程或论文吗 我从来没有见过这个 但我过去做过位图到 ASCII 艺术转换器 这是类似的
  • Swift 函数在应用程序中有效,但在 override func viewDidLoad() 中无效

    在我的 iOS 应用程序中 我有两个与 Firebase 相关的函数 我想在 viewDidLoad 中调用它们 第一个随机选择一个孩子 queryOrderedByKey 并将孩子的密钥作为字符串输出 第二个使用该密钥并且observeE
  • 将 Powershell.exe 的输入和输出重定向到 C++ 中的管道

    我正在尝试在 C 中执行 powershell 命令并通过管道获取其输出 我的程序非常适合 cmd exe 但是 当我尝试使用 powershell exe 执行相同的操作时 我只得到 W 作为输出 我已经注释了下面代码中需要修改才能执行
  • 在 asp.net 中动态调整图像大小

    为简单起见 假设我有一个网页需要显示图像的缩略图 图像位置存储在数据库中 图像存储在 Amazon S3 上 是否可以让我的网络服务器在将大图像传送到客户端之前缩小其尺寸 这样我就不必存储每个图像的缩略图 并且客户端可以下载较小的文件 关于
  • 如何在JNI中将指针从java传递到C?

    我有一个本机方法int sum int int 我如何从java端传递这个方法的参数 编辑 我成功运行的示例方法是 双 gsl stats mean doubleArray int int 这个方法在 GSL 中可用 因为我已经创建了共享对
  • Unicode (utf-8) 与 git-bash

    我在让 unicode 适用于 git bash 在 Windows 7 上 时遇到一些麻烦 我尝试了很多事情但没有成功 虽然 我不太确定造成这种情况的原因 所以我可能在错误的方向上工作 看来这应该是可能的 因为 cmd exe 的编码可以
  • PropertyAccessException:访问字段时出错

    我有一个实体User Entity public class User implements Serializable Id GeneratedValue strategy GenerationType IDENTITY Column na
  • 从变量更新 pom 文件的 Shell 命令

    以前 我使用以下命令获取 pom xml 中的版本并将其从 1 递增 在增量快照版本之前 0 0 1 bin bash version grep ri
  • 如何读取 build.gradle 中 local.properties 中定义的属性

    我已经设定sdk dir and ndk dir in 本地属性 我如何读取值sdk dir and ndk dir in the 构建 gradle file 您可以通过以下方式做到这一点 Properties properties ne
  • Delphi、OLE 和 Microsoft Scheduler 的问题

    我有控制台 Delphi 应用程序 它可以通过 OLE 与 Excell 一起使用 代码示例非常简单 procedure SaveBaseRecordsToFile BaseName string PaymentRecords TPayme
  • 在 RCP 应用程序中添加包资源管理器会导致丢失一些图标

    在我的 eclispe rcp 应用程序中 我添加了一个包资源管理器 添加了 org eclipse jdt ui 当我使用 rcp app 时 当我通过 新建项目向导 创建一个新项目以添加 常规项目 时 该项目已正确创建 但包资源管理器视
  • 文档写入给出了奇怪的输出

    我正在编写一个脚本来检测 jQuery 如果它不存在 则插入 Google CDN 版本和本地后备 不要问为什么 这不是我的想法 问题是当我尝试执行文档时 write 我得到一个奇怪的输出 document write
  • git word-diff-regex 可以处理多行更改吗?

    考虑一个像这样的简单文件 承诺 foo Edited bar 现在 当我跑步时git diff word diff regex a z 它给了我 foo bar 所以 这表明这个词foo已被替换为bar 请注意 分号未标记为已更改 没关系
  • 无法解析:com.android.support:design-v7:27.1.1

    我使用的是Android Studio 3 1 3 Gradle 构建同步失败 我使用了以下方法 但没有用 如果有任何解决方案请告诉我 maven url https maven google com 使重启和缓存无效 multiDexEn
  • 如何在 Android 中的 Facebook 页面墙上发帖?

    您好 我想发布任何消息或链接到 Facebook 页面 我尝试过的是这个 void postInfo try Bundle parameters new Bundle parameters putString message message
  • 使用 angularjs 从服务器下载文件

    我正在寻找一种方法来让用户选择服务器上存在的文件并使用 angularjs 下载它 我发现这段代码不起作用 所以有人有一种正确的方法吗 var content file content var blob new Blob content t
  • PowerShell - 如何使用 $_.Key 作为 $object 属性?

    我有一个像这样的哈希表 hash One One Two Two Three Three 这样做是行不通的 hash getEnumerator foreach object Key Value 然而这句话 hash getEnumerat
  • 使用 gnu clisp 运行 shell 命令

    我正在尝试为 clisp 创建一个 系统 命令 其工作原理如下 setq result system pwd now result is equal to my path here 我有这样的事情 defun system cmd ext
  • json 序列化器 NullValueHandling 不使用 datamember 属性

    在我的 Web api 项目中 现在我正在跳过 null 值 因此 返回 json 会忽略 null 值并打印属性 在 Global asax 文件中 manage the null in the response var json Glo