JsonConverter如何反序列化为通用对象

2024-02-02

我通过 webapi 发送这个结构:

[DataContract]
public class PacketData
{
    public enum Opcodes
    {
        Hello = 0x00,
        Close = 0x01,
        Serial = 0x02,
        GPIO = 0x04
    }

    [DataMember]
    public object Data { get; private set; }
    [DataMember]
    public Opcodes Opcode { get; private set; }

    public PacketData(Opcodes opcode, object data)
    {
        Data = data;
        Opcode = opcode;
    }
}

我的问题是,当我发送它时,我在服务器端设置我分配给数据几类前。自定义类1、自定义类2

现在,在反序列化时,我得到的不是对象字符串,而是:

{\r\n  \"Cmd\": 5,\r\n  \"BaudRates\": [\r\n    2400,\r\n    4800,\r\n    9600,\r\n    19200,\r\n    38400,\r\n    57600,\r\n    115200\r\n  ],\r\n  \"SerialPorts\": null,\r\n  \"IsOpen\": false,\r\n  \"BaudRate\": 0,\r\n  \"PortName\": null,\r\n  \"WriteCMD\": null,\r\n  \"WriteDATA\": null,\r\n  \"Read\": null\r\n}

所以 Data 是字符串而不是类或 C# 经典对象类型 还有一个问题,我不知道如何从字符串中识别它是 CustomClass1 还是 CustomClass2。

有什么想法如何解决这个问题吗?

Thanks.

编辑:包括反序列化和序列化

[HttpGet("Send", Name = "Send")]
public IActionResult Send()
{
    return Ok(WebAPI.Send(), HttpStatusCode.OK);
}

    public IEnumerable<string> Send()
    {
        List<string> packets = new List<string>();

        foreach (PacketData packet in StaticConfig.SendStack.ToArray())
            packets.Add(JsonConvert.SerializeObject(packet));

        return packets.ToArray();
    }

这是反序列化:

                string json = await client.GetStringAsync(new Uri("http://localhost:5000/api/Send"));

                string[] jsonArray = JsonConvert.DeserializeObject<string[]>(json);

                if (jsonArray.Length == 0)
                    Task.Delay(100).Wait();

                List<PacketData> packets = new List<PacketData>();

                foreach (string j in jsonArray)
                    packets.Add(JsonConvert.DeserializeObject<PacketData>(j));

                foreach (PacketData packet in packets)
                {
                    string p = packet.Data.ToString();

                    bool a = packet.Data is PacketSerialModel; // returns false

                    HandleReceivedData(this, new ReceivedDataArgs(packet));
                }

编辑2: 那么我想要什么呢?

我想将提到的字符串返回到 PacketData.Data 然后我可以使用类似这样的东西:

if(packet.Data is CustomClass1)
{
}
else if(packet.Data is CustomClass2)
{
  var b = packetData as CustomClass2;
  //...
}

目前我的 packet.Data 是字符串,我需要创建这个对象属性并根据 json 设置它们的值。

编辑3: 现在使用

JsonSerializerSettings()
{ TypeNameHandling = TypeNameHandling.Auto }

工作完美,但我必须替换传入的 json 字符串项目名称 就像下面的字符串一样:

["{\"Data\":{\"$type\":\"Shared.PacketSerialModel, ASP_MVC\",\"Cmd\":5,\"BaudRates\":[2400,4800,9600,19200,38400,57600,115200],\"SerialPorts\":null,\"IsOpen\":false,\"BaudRate\":0,\"PortName\":null,\"WriteCMD\":null,\"WriteDATA\":null,\"Read\":null},\"Opcode\":2}"]

我必须将 ASP_MVC 替换为第二个项目名称,除了替换之外还有其他解决方法吗?


要回答您更新的问题,“在交换包含以下内容的 JSON 数据时,如何重新映射程序集名称”$type使用 Json.NET 的不同 .Net 程序集之间的信息”,您有几个选项:

  1. 最简单的方法是将相关类型提取到共享 DLL 中,并从两个程序集中引用该 DLL。这解决了问题并减少了代码重复。

  2. 如果您无法做到这一点,则需要自己编写SerializationBinder https://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationbinder%28v=vs.110%29.aspx,可能继承自 Json.NET 的DefaultSerializationBinder http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Serialization_DefaultSerializationBinder.htm,如文档中所述:自定义序列化绑定器 http://www.newtonsoft.com/json/help/html/SerializeSerializationBinder.htm。如果你的课程是not通用,可以简单地重新映射assemblyName:

    public class SimpleAssemblyMappingSerializationBinder : DefaultSerializationBinder
    {
        readonly string oldAssemblyName;
        readonly string newAssemblyName;
    
        public SimpleAssemblyMappingSerializationBinder(string oldAssemblyName, string newAssemblyName)
        {
            this.oldAssemblyName = oldAssemblyName;
            this.newAssemblyName = newAssemblyName;
        }
    
        public override Type BindToType(string assemblyName, string typeName)
        {
            if (assemblyName == oldAssemblyName)
                assemblyName = newAssemblyName;
            return base.BindToType(assemblyName, typeName);
        }
    }
    

    对于类似的活页夹,请参见使用 TypeNameHandling.All 处理命名空间更改 https://stackoverflow.com/questions/9908913/handling-namespace-changes-with-typenamehandling-all.

    但如果你的课程are通用(例如,如果Data有时是一个List<CustomClass3>),你需要解析通用参数 https://msdn.microsoft.com/en-us/library/w3f99sx1%28v=vs.110%29.aspx在类型名称内。有关如何执行此操作的想法,请参阅如何为二进制格式化程序创建 SerializationBinder,以处理类型从一个程序集和命名空间到另一个程序集和命名空间的移动 https://stackoverflow.com/questions/19666511/how-to-create-a-serializationbinder-for-the-binary-formatter-that-handles-the-mo。这个问题是关于BinaryFormatter但答案也适用于 Json.NET。

  3. 要完全省略程序集名称和命名空间,您可以使用来自对象数据类型的 Json 序列化 https://stackoverflow.com/questions/34576078/json-serialization-for-object-data-type用于序列化和反序列化。

  4. 最后,您可以考虑切换到DataContractJsonSerializer https://msdn.microsoft.com/en-us/library/bb412170%28v=vs.110%29.aspx它通过使用间接交换类型信息合同名称而不是原始的 .Net 类型名称。虽然数据契约序列化器通常不如 Json.NET 灵活,但其基于契约的类型信息交换可能更适合这种情况。参见例如如何使用 DataContractSerializer 反序列化具有未命名类型集合的 JSON https://stackoverflow.com/questions/34384838/how-to-deserialize-json-with-unnamed-collection-of-types-using-datacontractseria.

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

JsonConverter如何反序列化为通用对象 的相关文章

  • 在调用堆栈中看到大量 clr!CLR Semaphore::Wait

    我们看到很多像下面这样的调用堆栈 我可以知道什么条件 情况会发生这种情况吗 OS Thread Id 0x48654 559 Current frame ntdll NtWaitForSingleObject 0xa Child SP Re
  • 每次调用新方法时触发事件

    我正在做一个logger for a c 应用程序需要记录每个方法被调用的时间以及每个方法执行时间 我可以通过调用自己的方法来做到这一点EventLogger LogMethodCall方法在每个方法的开头 但我想知道是否有办法使CLR每次
  • 在 DataGridView 中隐藏行非常慢

    我在 Winforms 应用程序中有一个 DataGridView 大约有 1000 行 未绑定 和 50 列 隐藏一列需要整整 2 秒 当我想隐藏大约一半的行时 这就成为一个问题 private void ShowRows string
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于
  • 使用 size_t 值反向遍历向量

    我想以相反的方向遍历向量的值 如您所知 向量的大小为 size t 当我使用以下代码时 for size t r m size 1 r gt 0 r x r f r for size t c r 1 c lt m size c x r m
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • WinForms - 表单大小错误

    我们有以下代码 private void MainForm Shown object sender EventArgs e RepositionForm private void RepositionForm Rectangle rect
  • Qt QML 数据模型似乎不适用于 C++

    我一直在使用中的示例http doc qt digia com 4 7 qdeclarativemodels html http doc qt digia com 4 7 qdeclarativemodels html这是 QML 声明性数
  • 函数参数评估顺序[重复]

    这个问题在这里已经有答案了 在 C 和 C 中 函数参数的求值是否有固定的顺序 我的意思是 标准怎么说 是吗left to right or right to left 我从书中得到的信息令人困惑 是否有必要function call应该使
  • C++ 错误:从“char”到“const char*”的转换无效

    我对 C 完全陌生 我创建了这个函数 bool guessWord string compWord cout lt lt Guess a letter string userLetter cin gt gt userLetter for u
  • ASP.NET MVC 中 ModelState.AddModelError 中的关键参数有什么意义?

    我在我的控制器中添加了验证检查来修改ModelState如果验证失败 例如 private bool ValidateMoney string raw string name decimal min decimal max try var
  • 如何解决内存碎片

    我们偶尔会遇到这样的问题 长时间运行的服务器进程 在 Windows Server 2003 上运行 由于内存分配失败而引发异常 我们怀疑这些分配由于内存碎片而失败 因此 我们一直在寻找一些可能对我们有帮助的替代内存分配机制 我希望有人能告
  • Mongodb - 为现有集合添加架构

    我的 MongoDB 中有一个包含 1300 万条记录的集合 不幸的是 当我创建这个集合时 没有为其创建模式 我想知道除了备份整个数据库 创建架构并上传所有数据之外 是否有任何方法可以添加 JSON 架构 您可以使用以下方法将 JSON 架
  • 如何在给定点停止线程?

    我试图停止一些线程 阅读一些有关优雅地执行此操作的正确方法的内容 但我一定做错了什么 因为它根本不起作用 起初我尝试不使用lock with IsRunning不稳定 然后尝试使用锁 这是我所拥有的 private volatile boo
  • 如何在 C# 中以编程方式创建柔和的颜色?

    根据所需的颜色数量均匀分布地生成它们 如果指定的计数为 8 则看起来像这样 List
  • 如何在 Winform DataGridView 中创建不同的单元格格式

    我有一个 DataGridView 我将其绑定到 DataTable DataTable 是一个全数字值 要求 DataGridView 中的每 n 行都包含文本 而不是数值 以便在视觉上为用户分隔部分 我很高兴在绑定后将此文本数据放入 D
  • 获取会议组织者邮件地址 EWS API

    我想使用 EWS API 获取会议组织者的邮件地址 目前 我刚刚获得约会项目的一些属性 我听说你可以设置你想要获取哪些属性 我的代码看起来像这样 CalendarView cview new CalendarView start end c
  • 清理堆分配对象的良好实践或约定?

    我正在学习C 我有 C C ObjC 背景 相当高级的语言 在 C 或 ObjC 上 作为函数或方法的结果返回堆分配的对象是很简单的 因为对象的清理是受管理的 按照惯例 会在适当的时候销毁 但我不知道在 C 中应该如何处理这个问题 例如 s
  • 从 STL 列表中删除项目

    我想创建一个函数 如果符合特定条件 则将项目从一个 STL 列表移动到另一个列表 这段代码不是这样做的方法 迭代器很可能会被擦除 函数失效并导致问题 for std list
  • AWS SES模板html部分是多行

    我正在使用 AWS SES 按照文档发送电子邮件https docs aws amazon com ses latest DeveloperGuide send personalized email api html https docs

随机推荐

  • 正确的 jQuery 图像加载()?

  • 在哪里可以找到 AWS CodeDeploy 部署日志?

    当我选择部署然后单击时 我可以在 Codedeploy 下的 AWS 控制台中看到日志choose events 但它们似乎被截断了 如果我通过 SSH 进入实例 这些 codedeploy 部署日志位于哪里 我看到登录 var log a
  • 将 Python 列表插入 MySQL 的列中

    我有一个列表 我想使用 Python 将该列表的每个元素输入到 MYSQL 列的关联索引单元格中 E g lst 11 22 33 44 55 66 MYSql 列 Data 11 22 33 44 55 66 我怎样才能做到这一点 以下代
  • 什么给出了 java.lang.NoClassDefFoundError?

    我想读取 Excel 文件 但给出 Exception in thread main java lang NoClassDefFoundError org apache xmlbeans XmlObject at ExcelReader m
  • 将 IR 转换为 Z3 公式?

    我在 IR 中有一些代码 并且该代码已经是 SSA 形式 现在我正在尝试将此代码转换为SMT公式 然后将其提供给Z3进行一些验证 我有一些疑问 有没有技术论文详细解释如何将SSA IR转换为SMT公式 我四处寻找 一无所获 对于那些计算指令
  • 从给定索引开始枚举 NSArray 双向搜索(无环绕)

    例子 我有一个包含 15 个对象的数组 我想从给定的索引开始枚举 说从索引 5 开始 然后是上面的索引 下面的索引 上面 下面等等 我不希望它环绕 而是停止并继续朝未探索的方向前进 所以我的例子中索引的顺序是 5 6 4 7 3 8 2 9
  • 神经网络特征提取

    我正在使用神经网络进行字母和数字的简单识别 到目前为止 我使用字母图像的每个像素作为网络的输入 不用说 这种方法产生的网络非常大 所以我想从图像中提取特征并将它们用作神经网络的输入 我的第一个问题是字母的哪些属性有利于识别它们 第二个问题是
  • 将PC添加到域并同时更改名称的问题

    我正在尝试简化将 PC 添加到域的过程 到目前为止 我可以更改 PC 名称 重新启动并将 PC 添加到特定 OU 然后再次重新启动 我和OP有同样的问题这个话题 https stackoverflow com questions 62177
  • 具有泛型构造函数的泛型类? [复制]

    这个问题在这里已经有答案了 我有一个通用类 构造函数需要接受一个参数 该参数是同一类的另一个实例 问题是另一个实例可以具有不同的泛型类型 看起来 C 允许我拥有一个具有自己的泛型类型的方法 但这对于构造函数来说似乎是不允许的 public
  • SwiftUI TextField 货币格式问题

    我在使用 TextField 输入货币金额时遇到了 SwiftUI 最终用户的可用性问题 绑定字段是双精度型 初始设置为 0 当显示文本字段时 提示为 0 00 问题是 当用户想要输入一个值时 他们必须手动使用退格键删除 0 00 另外 如
  • Oracle XE查询日志

    在 Postgres 中 您可以打开查询日志记录 从而生成一个包含任何客户端发出的所有查询的文件 Oracle XE 中是否有类似的可能性 如何打开它以及在哪里可以找到生成的文件 你会 更改会话设置 sql trace true 跟踪文件将
  • 为本机 iOS 应用程序创建 Jitsi Meet 框架并集成到 Xcode 项目中

    我已经从 Jitsi meet 网站和 git repo 检查了详细信息 以在本机应用程序中实现它 执行构建命令后 我无法在提到的位置找到框架 我也无法识别符号位置 如建议的那样 如何获取需要包含在本机应用程序中的框架 以使 jitsi m
  • 带声音的图像按钮不起作用

    我在android studio中制作了一个程序 其中有10个图像按钮 每个图像按钮单击时都会产生声音 但是 当我在模拟器上运行它们时 只有前 7 个图像按钮会发出声音 不在乎我单击的按钮的顺序 我对此很陌生 请帮助我 这是我的代码 pub
  • 如何在 ASP.NET 中找到当前页面的(文件)名称?

    如何在后面的代码中找到 default aspx 当前页面或Web控件的名称 我想编写一个使用这个名称的超类 你的意思是你想找到当前执行的对象的原始文件名 即 从您想要检索的控件 MyControl 内部MyControlOnDisk as
  • pythonunittestassertCountEqual使用'is'而不是'=='?

    我正在尝试使用 python 的unittest库来编写一些单元测试 我有一个返回对象的无序列表的函数 我想验证对象是否相同 并且我正在尝试使用断言计数等于 http docs python org py3k library unittes
  • 如何通过客户端 Java 代码获取 Google Web Toolkit 中的当前 URL?

    我试图读取 URL 的查询参数 https stackoverflow com questions 4514940 reading request parameters in google app engine with java在客户端
  • 处理 NULL 的最佳方法

    在我的函数顶部 我正在尝试用最好的方法来处理 C 中进入我的程序的 null 值 检查和处理空值的最佳方法是什么 为什么 我已经添加了我现在正在使用的完整代码 Resharper 告诉我使用选项 1 通常我会按照它所说的去做 因为我明白为什
  • 使用 JS 强制页面缩放至 100%

    我在 Canvas 中创建了一个小游戏 但遇到了问题 某些将默认缩放设置为 100 以外的用户无法看到整个游戏页面 我尝试过使用这个CSS zoom 100 这个 HTML 还有这个JS style zoom 75 有什么想法如何以编程方式
  • React Redux:获取 Props 并更新状态

    我是第一次尝试 React Redux JS 我对在组件中设置状态与让 redux 更新它有点困惑 我想单击一个按钮将 lightOn 设置为 true 并显示更新的 this props lightOn 值 我错过了一些基本的东西 但不确
  • JsonConverter如何反序列化为通用对象

    我通过 webapi 发送这个结构 DataContract public class PacketData public enum Opcodes Hello 0x00 Close 0x01 Serial 0x02 GPIO 0x04 D