使用 Json.NET 对 DataContractJsonSerializer 使用的结构中的字典进行(反)序列化? [复制]

2023-12-22

有没有办法使用 Json.NET 进行(反)序列化,但继续使用字典序列化约定DataContractJsonSerializer?

换句话说,有没有办法以这种结构读写 JSON:

{ "MyDict" : [
    { "Key" : "One",
      "Value" : 1 },
    { "Key" : "Two",
      "Value" : 2 }
    ] }

使用这样的类(带有 Json.NET 属性):

public class MyClass
{
    public Dictionary<string, int> MyDict { get; set; }
}

看起来像 Json.NET 的KeyValuePairConverter可能会有所帮助,但如果是这样,我找不到正确的方法来应用它。

我尝试归因MyDict with [JsonProperty(ItemConverterType = typeof(KeyValuePairConverter))], 这一页 https://json.codeplex.com/workitem/22558Even 似乎暗示这可以工作,但是添加这样的属性会导致ArgumentOutOfRangeException在序列化期间。


你说得对,KeyValuePairConverter在这里似乎无法正常工作。在不深入 Json.Net 源代码的情况下,我只能推测原因。作为解决方法,您可以进行自己的自定义JsonConverter很容易地完成这个翻译:

class MyDictionaryConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(Dictionary<string, T>));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JArray array = JArray.Load(reader);
        Dictionary<string, T> dict = new Dictionary<string, T>();
        foreach (JObject obj in array.Children<JObject>())
        {
            string key = obj["Key"].ToString();
            T val = obj["Value"].ToObject<T>();
            dict.Add(key, val);
        }
        return dict;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        Dictionary<string, T> dict = (Dictionary<string, T>)value;
        JArray array = new JArray();
        foreach (KeyValuePair<string, T> kvp in dict)
        {
            JObject obj = new JObject();
            obj.Add("Key", kvp.Key);
            obj.Add("Value", JToken.FromObject(kvp.Value));
            array.Add(obj);
        }
        array.WriteTo(writer);
    }
}

使用以下命令将转换器应用到字典中[JsonConverter]属性:

public class MyClass
{
    [JsonConverter(typeof(MyDictionaryConverter<int>))]
    public Dictionary<string, int> MyDict { get; set; }
}

这是一个简短的演示程序,显示转换器的运行情况(完整往返):

class Program
{
    static void Main(string[] args)
    {
        MyClass mc = new MyClass { MyDict = new Dictionary<string, int>() };
        mc.MyDict.Add("One", 1);
        mc.MyDict.Add("Two", 2);

        string json = JsonConvert.SerializeObject(mc, Formatting.Indented);
        Console.WriteLine(json);
        Console.WriteLine();

        MyClass mc2 = JsonConvert.DeserializeObject<MyClass>(json);
        foreach (KeyValuePair<string, int> kvp in mc2.MyDict)
        {
            Console.WriteLine(kvp.Key + " == " + kvp.Value);
        }
    }
}

上面的输出:

{
  "MyDict": [
    {
      "Key": "One",
      "Value": 1
    },
    {
      "Key": "Two",
      "Value": 2
    }
  ]
}

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

使用 Json.NET 对 DataContractJsonSerializer 使用的结构中的字典进行(反)序列化? [复制] 的相关文章

随机推荐

  • 实现接口的类列表

    有没有办法实现类似的东西 List
  • 在jquery中获取外部url的html

    如何使用 jquery 获取外部 URL 的 HTML 简短的回答是你不能 因为 AJAX 请求被限制在相同的 子 域和端口上 同源政策 https developer mozilla org En Same origin policy f
  • Robocopy 后,复制的目录和文件在目标驱动器上不可见

    我很高兴使用 robocopy 将我的计算机备份到外部 USB 驱动器 这很棒 因为它只复制已更改 更新 新的文件 我可以将外部驱动器带到任何机器上并查看它 就像它是计算机上的另一个驱动器一样 我最近购买了一个 750g 和另一个 1tb
  • CoreMotion 在后台状态更新

    借助最新 iOS 设备中的 M7 芯片 当用户使用 CMMotionActivityManager 从静止状态变为跑步 行走等时 可以通过编程方式获得通知 Stava 和 Runkeeper 都用过这个自动暂停 GPS 轮询 http gi
  • 如何从另一个页面控制viewPages页面

    我有一个ViewPager共 3 页listView在每个页面中 我想要动画listView以某种方式 当用户水平滑动下一页时 listView应该根据下一页的宽度来 即第一个项目应该完全推入 第二个应该是可见的一半 口渴应该是第二个可见的
  • 如何在 Material UI 5 中使用 useTheme?

    我刚刚开始使用 Material UI 5 0 4 带有styled components 我想访问组件中的主题 我在网上查了一下 看到useTheme 所以我检查了文档并found it https mui com styles adva
  • 自动实例化会话bean?

    我有一个会话 bean
  • 是否可以通过电子邮件地址进行 XSS 攻击?

    我想知道电子 邮件地址是否可以用于XSS攻击 假设有一个网站 人们可以在其中注册并提供他的电子邮件地址 如果有人想要攻击给定的网站 他或她可能会创建一个电子邮件地址 例如 stmpname com 然后使用该电子邮件地址攻击该网站 电子邮件
  • 编写 lisp emacs 键绑定并且无法指定 字符

    由于某种原因 我将向后杀字的默认 M del 键绑定映射到匹配括号的扫描 并且重置不起作用 所以我尝试在 lisp 中设置全局键绑定 所以我在 emacs d init el 中编写了 lisp 命令 全局设置键 kbd M h 向后杀字
  • XSD 和 WSDL 位于不同的目录中

    在我的工作中使用 jaxws maven plugin 进行代码生成 我有两个项目分别是 common 和 client 结构大致如下 app common resource some xsd client resource some ws
  • 在 Blazor Web Assembly 应用中显示本地计算机摄像头源

    我已将问题简化为样板 Blazor Web Assembly 应用程序 该项目直接来自向导 添加了以下代码 我已将 Index razor 页面更改为 page inject IJSRuntime JSRuntime using Syste
  • 多设备混合应用程序中未指定 NodeJs 的路径

    当我尝试构建项目时 我收到一条错误消息 例如 NodeJs 的路径尚未指定 文件名为 Microsoft MDA target 如何在其中指定node js路径 错误消息是 尚未指定 NodeJs 的路径 请在构建之前检查 NodeJs 是
  • 错误:模板可能不是“虚拟”

    我希望能够向基类 MCFormater 提供适用于不同类型 uint32 uint8 的格式化方法 class MCFormater public MCFormater virtual MCFormater virtual mcc t Ge
  • 如何访问 Doctrine2 中 PrePersist LifecycleCallback 的旧值

    我在 Doctrine2 中有一个实体 并将 HasLivecycleCallbacks 与 PrePersist 一起使用 一般来说 这工作得很好 但我只想在实体中的某些字段发生变化时更改版本 我有机会获得旧的价值观吗 还是只是更改了键值
  • 我可以通过 ssh 转发环境变量吗?

    我使用多个不同的服务器 如果能够设置一些环境变量 以便当我通过 SSH 登录时它们在所有服务器上都处于活动状态 这将很有用 问题是 某些变量的内容包含敏感信息 散列密码 所以我不想把它留在 bashrc 文件中 我只想将它保留在内存中 我知
  • ThreeJS - 直线和球体的交点

    我的场景中有两个对象 一条红线和一个球体 当相机旋转 缩放 移动时 我需要检查以下内容 从相机当前位置看 该线是否与球体相交 请参见下图 请用这个 JS 小提琴 http jsfiddle net YxK63 7 在图像上创建场景 我知道如
  • Jekyll - 如何避免在 YAML frontmatter markdownify 项目上添加段落

    好的 我有一个项目 我正在使用 Jekyll 进行播客项目 我选择通过 YAML Front Matter 项目在 shownotes 中列出主机 hosts Name A Name B Name C 使用这段代码 li strong Ho
  • CSV 中数据提取末尾的尾随逗号

    我的问题的一些背景 我有一个由 MS Access 中的查询创建的 CSV 文件 CSV 文件的主体包含列 姓名 地址 邮政编码 日期等 文件的最后一行包含数据摘要 文件名 日期 时间戳和记录总数 由于所有字段都包含字符串 并且我们不希望系
  • Travis CI for Android - 构建错误:无法找到目标且无法找到依赖项

    我正在尝试为我的 Travis CI 设置现有的Android项目 https github com evercam evercam play android我添加了 travis yml language android android
  • 使用 Json.NET 对 DataContractJsonSerializer 使用的结构中的字典进行(反)序列化? [复制]

    这个问题在这里已经有答案了 有没有办法使用 Json NET 进行 反 序列化 但继续使用字典序列化约定DataContractJsonSerializer 换句话说 有没有办法以这种结构读写 JSON MyDict Key One Val