【问题标题】:C# Newtonsoft JSON library outputs different wrong JSON keys for same dataset on different computersC# Newtonsoft JSON 库为不同计算机上的相同数据集输出不同的错误 JSON 键
【发布时间】:2019-03-03 21:56:50
【问题描述】:

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

现在问题来了:

我在我的 c# 应用程序中使用 Newtonsoft JSON library。我有以下 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 位电脑,而他们的电脑是 64 位电脑。

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

我的普通 JSON:

其他人的奇怪 JSON:

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

【问题讨论】:

  • 您应该粘贴文本而不是屏幕截图。
  • @Aybe 请再仔细阅读问题,以便您了解图片对应的文字已经提供(图片是为了更深入地了解已经提供的文字)
  • 不,您没有在第二张屏幕截图上粘贴要突出显示的代码。
  • @Aybe 这不是亮点 - 它只是 Chrome 检查器显示的内容。当我尝试将其复制并粘贴到此处时,它只会更改为那些看起来像向后箭头的字符。您可以尝试选择该箭头中的那些字符系列,以了解那里发生了什么!
  • 查看w3schools.com/charsets/ref_utf_punctuation.asp 并查看您的代码,这应该可以为您提供有关幕后情况的线索;我猜应该涉及一些不变的文化或规范化?即都是不可见的字符,生成 JSON 时,该用户的 PC 出现问题。

标签: c# json.net


【解决方案1】:

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

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

【讨论】:

  • 这只是暂时解决了问题。现在问题又出现了。现在,即使我将 Newtonsoft 换成 Microsoft 的 Web.Script.Serialization。 Check the new posted SO question for more details
  • 这意味着你有一个不同的问题,与 JSON 无关。 all Web API 和 ASP.NET Core 项目使用 JSON.NET。如果有任何问题,成千上万的开发人员会注意到
  • @PanagiotisKanavos 是的,你是对的。这就是为什么我将这个问题重新发布到另一个问题,提供更多信息。
  • 编辑:链接到另一个新发布的 SO:stackoverflow.com/questions/55224030/…
猜你喜欢
  • 2020-11-23
  • 2018-07-30
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
相关资源
最近更新 更多