如何在 .NET 中自定义 JSON 枚举的反序列化?

2024-05-25

我有以下示例 C# 代码,它是使用 svcutil.exe 应用程序从 xsd 自动生成的。

    [DataContract]
    public enum Foo
    {
        [EnumMember(Value = "bar")]
        Bar = 1,

        [EnumMember(Value = "baz")]
        Baz = 2
    }

    [DataContract]
    public class UNameIt
    {
        [DataMember(Name = "id")]
        public long Id { get; private set; }

        [DataMember(Name = "name")]
        public string Name { get; private set; }

        [DataMember(Name = "foo")]
        public Foo Foo { get; private set; }
    }

以下是一个单元测试,尝试将示例 JSON 文档反序列化为 U Name It 类。

    [TestClass]
    public class JsonSerializer_Fixture
    {
        public const string JsonData = @"{ ""id"":123456,
                                           ""name"":""John Doe"",
                                           ""foo"":""Bar""}";

        [TestMethod]
        public void DataObjectSimpleParseTest()
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(UNameIt));

            MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(JsonData));
            UNameIt dataObject = serializer.ReadObject(ms) as UNameIt;

            Assert.IsNotNull(dataObject);
            Assert.AreEqual(123456, dataObject.Id);
            Assert.AreEqual(Foo.Baz, dataObject.Foo);
        }
    }

不幸的是,测试失败了,原因如下:

System.Runtime.Serialization.SerializationException:有一个 反序列化 MyNamespace.Units.UNameIt 类型的对象时出错。这 值“Bar”无法解析为类型“Int64”。

如果我更新 JSON 字符串以将 Enum 的字符串说明符替换为整数,则测试将通过,例如

public const string JsonData = @"{ ""id"":123456,
                                   ""name"":""John Doe"",
                                    ""foo"":""1""}";

我没有灵活性来更改提供的 JSON,因此我必须弄清楚如何在序列化时转换字符串枚举表示。理想情况下,我希望在不必更改我的自动生成类的情况下促进这一点,因为一旦我重新生成该类,我就会丢失我的更改。

我想知道是否可以将 DataContractJsonSerializer 扩展到自定义句柄枚举?或者也许有更好的方法来做到这一点?


这种行为是按设计。这是来自MSDN 上的枚举和 JSON 段落 http://msdn.microsoft.com/en-us/library/bb412170.aspx:

枚举成员值在 JSON 中被视为数字,即 与数据合同中处理它们的方式不同,它们在数据合同中的处理方式不同 包含为成员名称。

此外数据契约Json序列化器 http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.aspx将自动序列化所有枚举,因此枚举成员属性 http://msdn.microsoft.com/en-us/library/system.runtime.serialization.enummemberattribute.aspx实际上被忽略了。

For a 解决方法, 看一眼这个答案关于SO https://stackoverflow.com/a/794962/26396.

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

如何在 .NET 中自定义 JSON 枚举的反序列化? 的相关文章

  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • JavaScript 相对路径

    在第一个 html 文件中 我使用了一个变量类别链接 var categoryLinks Career prospects http localhost Landa DirectManagers 511 HelenaChechik Dim0

随机推荐

  • 断言和要求之间的区别

    您好 我最近刚刚开始从 Udemy 学习 Solidity 尽管在几乎完成课程后我还没有理解 assert 和 require 之间的区别 当不满足要求时 它们不是都会破坏功能吗 在合约内的 Gas 优化方面 两者相比是否有优势 来自文档
  • RegEx 使用 match() 在 JavaScript 中提取字符串数组

    我正在尝试使用string match 在 javascript 中使用正则表达式来提取字符串数组 这是一个示例字符串 CREATE TABLE listings listing id INTEGER UNIQUE state TEXT t
  • 为什么函数会修改列表以及如何防止它发生?

    我正在 Python 3 7 x 中调用一个函数并向其传递一个列表 我愿意not希望修改列表 在函数内部 我复制了列表并对其进行修改 函数完成后 传递给函数的原始列表已被修改 为什么会发生这种情况 我该如何预防 这是代码 def appen
  • 如何复制身份列中的数据?

    我有一张桌子identity列在一台服务器中 并且在另一台服务器中有一个具有相同结构的其他表 现在我想将所有数据从一个表复制到另一个表 但我无能为力 我已经创建了一个链接服务器 我用这个 insert into server databas
  • 网页优化:为什么组合文件速度更快?

    我读过 将所有 css 文件合并为一个大文件 或将所有脚本文件合并为一个脚本文件 可以减少 HTTP 请求的数量 从而加快下载速度 但我不明白这一点 我认为如果你有多个文件 最多有一个限制 我相信在现代浏览器上是 10 个 浏览器会并行下载
  • 调用API“找不到模块”时AWS lambda层错误

    我尝试使用 AWS Lambda 层 观看了有关它的教程 但收到错误 找不到模块 service aws nodejs package exclude gitignore package json git provider name aws
  • WebRTC、getDisplayMedia() 不捕获远程流中的声音

    我有一个自己的网络应用程序 它基于peerjs库 它是一个视频会议 我正在尝试使用 MediaRecorder 进行录制 但我遇到了一个非常不愉快的情况 捕获我的桌面流的代码如下 let chooseScreen document quer
  • 如何在Python中仅列出顶级目录?

    我希望能够仅列出某个文件夹内的目录 这意味着我不需要列出文件名 也不需要其他子文件夹 让我们看看一个例子是否有帮助 在当前目录中我们有 gt gt gt os listdir os getcwd cx Oracle doc DLLs Doc
  • 合法管理员如何获取 Active Directory 中的用户密码?

    如果密码以可逆加密方式存储在 Active Directory 中 管理员 开发人员如何提取和解密该密码 具体来说 我指的是this http technet microsoft com en us library cc784581 WS
  • 将带有 itext 滚动条的表格的可编辑单元格设为只读

    请找到下面的代码 public class MakingFieldReadOnly implements PdfPCellEvent The resulting PDF public static final String RESULT1
  • mod_rewrite 可以转换任意数量、任意名称的参数吗?

    我对 mod rewrite 完全是个新手 我想做的事情听起来很简单 我不想拥有domain com script php a 1 b 2 c 3 我想要 domain com script a 1 b 2 c 3 问题是我的脚本采用各种组
  • 将数字 n 拆分为 k 个不同数字的总和

    我有一个数字 n 我必须将它分成 k 个数字 使得所有 k 个数字都是不同的 k 个数字的总和等于 n 并且 k 最大 例如 如果 n 为 9 则答案应为 1 2 6 如果 n 为 15 则答案应为 1 2 3 4 5 这就是我尝试过的 v
  • 如何在 Slack 机器人中获取用户名/用户 ID

    https github com DeronLee starbot git https github com DeronLee starbot git 我创建了一个 Slack 机器人 它运行良好 但是当有人向机器人发送消息时 我无法知道是
  • Bool类型返回规则

    我使用 dapper ORM 所以我使用两个规则Query
  • 使用webrtc时可以关闭SRTP吗

    现在我测试webrtc与SIP客户端 sx20 的通信 我使用 webrtc sdp 发送邀请消息 但 sip 客户端答案没有指纹 并且 sip 客户端的答案不是 SRTP 只是 RTP 所以我需要关闭WEBRTC中的SRTP 我可以做吗
  • 如果未设置,则从控制台读取 Makefile 变量

    我正在更新一个从外部源访问某些资源的 Makefile 即存在以下形式的规则 External cvs up 对于不受限制的资源 它可以按预期工作 现在 出现了功能漂移 外部资源需要更复杂的登录 因此规则已更改为与此没有太大不同的内容 Ex
  • 在Excel中过滤后打印可见区域的宏

    我有一个根据过滤表的宏column A价值观 现在我想打印only过滤器后的可见行 但遗憾的是它打印了所有行 包括过滤期间隐藏的顶部和底部行 在我的工作表中 有来自的数据Column A I 但打印区域只能是Columns C I 过滤后的
  • 詹金斯管道如果其他不工作

    我正在创建一个示例詹金斯管道 这是代码 pipeline agent any stages stage test steps sh echo hello stage test1 steps sh echo TEST stage test3
  • 访问结构向量

    我有一个结构 struct OutputStore int myINT string mySTRING 如果我创建一个 OutputStore 类型的数组 如下所示 OutputStore OutputFileData new Output
  • 如何在 .NET 中自定义 JSON 枚举的反序列化?

    我有以下示例 C 代码 它是使用 svcutil exe 应用程序从 xsd 自动生成的 DataContract public enum Foo EnumMember Value bar Bar 1 EnumMember Value ba