首页 > 解决方案 > C# Newtonsoft JSON 库为不同计算机上的同一数据集输出不同的错误 JSON 键

问题描述

我不知道如何解决这个问题。作为开始解决这个问题的一种方法,我所能想到的就是我的开发机器是 32 位的,而其他经过测试的计算机是 64 位的(顺便说一句,我周围没有其他 32 位机器可以测试)。无论如何,这是一个奇怪的场景。

现在到这个问题:

我在我的 c# 应用程序中使用Newtonsoft JSON 库。我有以下 c# 类要序列化:

class sync_object
    {

        //newtonJson give bad keys to these object names on 64bit systems

        public Dictionary<string, List<Dictionary<string, string>>> table_records { get; set; }
        public Dictionary<string, List<string>> class_list_with_subjects_offered { get; set; }
        public Dictionary<string, List<string>> class_list_with_scoreheads_offered { get; set; }
        public List<string> class_groups_ordered { get; set; }
    }

在创建一个实例sync_object并用数据填充它之后,我做了JsonConvert.SerializeObject(instance_of_sync_object)并发送到我的服务器。然后,当我记录在服务器端(Laravel PHP)收到的 JSON 时,我得到一个完美的 JSON 转储到 PHP 中,如下所示:

array ( 'table_records' => array ( 'personal_db' => array (...) ) , 'class_groups' => array(...) )

但是,在其他 2 台计算机(我的应用程序用户)上,我得到了与上面相同的 JSON 结构,但唯一的区别是所有第一级 JSON 键(如上面的“table_groups”和“class_groups_ordered”)都被替换为跟随奇怪的字符(您可能想使用光标选择它以观察它包含许多不可打印的字符):

'‮‫‫‮‮‌​‎​‭‎‏‮‎​‎‪‭‪​‍‮‬‌‏‬‮' => 

正如我之前提到的,这些计算机和我的唯一明显区别是我的计算机是 32 位 PC,而他们的计算机是 64 位。

此外,作为提供更多信息的一种方式,由于 JSON 转储是在我的 Laravel 后端使用 Monolog 完成的,因此我可以看到 Chrome 中的 DOM 检查器,如下所示:

我的普通 JSON: 在此处输入图像描述

来自其他人的奇怪 JSON: 在此处输入图像描述

所有这些机器上都运行相同的 Newtonsoft Json 库。

标签: c#json.net

解决方案


本能地,我将所有的 snake_case 对象属性名称都更改为 PascalCase,噩梦就结束了!

(注意:我在Newtonsoft JSON 文档中没有发现任何表明属性名称的大小写在数据序列化中很重要的内容)


推荐阅读