Json.Net 序列化类名而不是内部属性

2023-11-28

这是代码:

public class ParameterDictionary : Dictionary<HydroObjectIdentifier, string>
{

    public void WriteToJson(string jsonFilePath)
    {
        string json = Newtonsoft.Json.JsonConvert.SerializeObject(this, formatting: Newtonsoft.Json.Formatting.Indented);
        System.IO.File.WriteAllText(jsonFilePath, json);
    }

}

public struct HydroObjectIdentifier
{

    public string Name { get; set; }
    public string TypeName { get; set; }

    public HydroObjectIdentifier(string name, string typeName)
    {
        this.Name = name;
        this.TypeName = typeName;
    }

}

...这是 Json 结果。请注意,它显示了类名称RSEngine.HydroObjectIdentifier而不是它的参数,这不是我的代码中所打算的。

{
  "RSEngine.HydroObjectIdentifier": [
    {
      "myString"
    },
    ...

正如注释中所解释的,预期的行为是将 Name 和 TypeName 写入 json,而不是类的名称。


您看到这种行为的原因是因为您正在使用复杂的对象(HydroObjectIdentifier) 作为字典中的键。在 JSON 中,对象键必须始终是字符串,每the spec。当 Json.Net 尝试序列化字典时,它会看到你的键是not字符串。由于它需要一个字符串,因此它只需调用ToString()在你的课堂上。默认实现ToString()在 C# 中返回类型的名称,在您的情况下是RSEngine.HydroObjectIdentifier.

如果你实现自己的ToString()方法,正如另一个答案中所建议的那样,那么您可以将密钥设置为您想要解决的问题。但是,这种方法的缺点是您无法将 JSON 反序列化回字典中。这是因为 Json.Net 没有可以使用相反的“FromString”方法将序列化键从字符串转换回标识符类。如果您需要能够使用 JSON 进行完整的往返(序列化和反序列化),那么您将需要不同的解决方案。

在 Json.Net 中,有几种可能的方法来处理复杂的字典键:

  1. 实施一个TypeConverter对于您的标识符类,如中所述Json.Net 序列化指南. See 如何:实现类型转换器有关详细信息,请参阅 MSDN。实现类型转换器后,您需要用[TypeConverter]属性,以便 Json.Net 知道使用它。
  2. 使用自定义JsonConverter用于更改键值对写入 JSON 的方式的字典。看如何序列化从字典派生的类有关该方法的示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Json.Net 序列化类名而不是内部属性 的相关文章

随机推荐

  • AutoIt 类似于 Java 的 GUI 自动化工具 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我需要对我的模块插入的软件进行自动化 UI 测试 我无权访问主机的代码 所以我需要像 AutoIt 这样的东西 由于 AutoIt 不能与 Swin
  • ArraySegment 类有什么用?

    我刚刚遇到ArraySegment
  • 标记未出现在传单中的连续世界上

    当我设置选项时continuousWorld true标记不会显示在克隆图块上 仅显示在主世界上 这是设计好的行为吗 可能是其他选项 我没有注意到 来显示这些标记的存在 UPD My aim to repeat markers on eve
  • 如何使用python进行坐标仿射变换?第2部分

    我有与这里描述的相同的问题 如何使用python进行坐标仿射变换 我试图使用所描述的方法 但由于某些原因我会收到错误消息 我对代码所做的更改是替换主系统和辅助系统点 我通过使用不同的原点创建了辅助坐标点 在我正在研究这个主题的实际情况中 测
  • 在 gevent 中,如何转储所有正在运行的 greenlet 的堆栈跟踪?

    出于调试目的 我想迭代所有 greenlet 并获取它们的跟踪记录 如何使用 gevent 做到这一点 基本上 我想做的 gevent 相当于this 您可以使用gc模块迭代堆上的所有对象并搜索 greenlet Greenlets 将堆栈
  • 删除 Google Apps 脚本文档服务中的内容

    如何刷新 Google Apps 脚本文档服务中的文档 我是否需要循环遍历所有类型的元素 例如段落 图像 表格并在小时候删除它们 有没有更简单的方法来删除文档正文中的所有内容 谢谢你 根据文档 the Document setText应该可
  • 如何标准化图像颜色?

    在他们的论文中描述维奥拉 琼斯物体检测框架 Viola 和 Jones 提出的鲁棒实时人脸检测 据说 用于训练的所有示例子窗口均已标准化为方差 最大限度地减少不同照明条件的影响 我的问题是 他们使用什么样的工具来标准化图像 我不是在寻找 V
  • 无法将 Jinja2 模板包含到 Pyinstaller 分发中

    我有一个使用 Jinja2 模板的 python 脚本 我正在尝试使用 Pyinstaller 创建一个单文件夹发行版 在 Jinja 中 我让程序通过使用PackageLoader班级 下面的代码显示它指向我的templates下的文件夹
  • 使用 tSQLt 对 SSIS 包进行单元测试

    我真的很喜欢 tsqlt 来测试过程和函数 但真的希望能够执行 SSIS 包并利用 FakeTable 和 AssertEquals 来确定 SSIS 包是否做了它应该做的事情 有没有人探索过这条路径 是否可以通过 tsqlt 包装您的测试
  • 为列名添加前缀

    当阅读以下内容时helpfile应该可以在列名中添加前缀 colnames x do NULL TRUE prefix col 以下内容对我不起作用 我在这里做错了什么 m2 lt cbind 1 1 4 colnames m2 do NU
  • 使用 chrome.tabs 与 browser.tabs 实现浏览器兼容性

    我正在将 Chrome 扩展程序移植到 Firefox 根据 MDN 有一个浏览器选项卡chrome应该支持的API However browser不是 Chrome 稳定对象 同时chrome tabs在 Firefox 中工作得很好 更
  • rdtsc,循环次数过多

    include
  • CSS 显示属性上的转换

    我目前正在设计一个 CSS 大型下拉 菜单 基本上是一个常规的纯 CSS 下拉菜单 但包含不同类型的内容 眼下 CSS 3 过渡似乎不适用于 display 属性 也就是说 你不能从display none to display block
  • Android:如何使用非字符串选择参数查询 SQLiteDatabase?

    有没有直接查询的方法SQLiteDatabase选择参数不是String types 特别是 如果 arg 是byte type 我能找到的最接近的是SQLiteDatabase compileStatement 它返回一个SQLiteSt
  • 使用 ARC 时的条件编译

    有没有办法询问编译器是否打开了 ARC 然后根据该值进行条件编译 例如 我有一个协议 protocol ProtocolA required void protocolMethodOne optional void protocolMeth
  • 使用 Nokogiri 和 Ruby 从 html 文档获取链接和 href 文本?

    我正在尝试使用 nokogiri gem 提取页面上的所有 url 及其链接文本 并将链接文本和 url 存储在哈希中 a href foo Foo a a href bar Bar a 我想回来 Foo gt foo Bar gt bar
  • Python - 在 Pandas DataFrame 中取消嵌套单元格

    假设我有DataFrame df a b c v f 3 4 5 v 2 6 v f 4 5 我想制作这个df a b c v f 3 v f 4 v f 5 v 2 6 v f 4 v f 5 我知道如何在 R 中进行这种转换 使用tid
  • 如何在 Flutter 中传递 HTTP post 请求中的标头?

    当我调试应用程序时 收到 415 错误 不支持的媒体类型 我知道我缺少在帖子查询中传递标题 我已经使用地图来传递数据 请帮助我如何传递标题 或者请为我提供一个使用 JSON 在 Flutter 中注册 注册的示例 import dart a
  • Windows 中的 TLS 回调

    这是测试代码 include windows h include iostream using namespace std declspec thread int tls int 0 void NTAPI tls callback PVOI
  • Json.Net 序列化类名而不是内部属性

    这是代码 public class ParameterDictionary Dictionary