当对DTO数组使用servicestack deserializationToString时,空对象位于列表的末尾

本文关键字:于列表 列表 对象 数组 DTO servicestack deserializationToString 当对 | 更新日期: 2023-09-27 17:54:51

我在Visual Studio 2013上编码 c# ,我正在尝试使用ServiceStack 3.9.71反序列化一些JSON。它们包含在文件中(不在我的控制之下),当我试图反序列化它时,我最终得到了DTO的正确数组,但此外,我在数组的末尾有一个空对象。我已经将其缩小到文件末尾的回车("'r")。我能做的一些解决方案是修剪字符串,或者删除所有的"'r",或者在GIT中禁用CRLF自动开关,并且在提交时超级勤奋,然而,我觉得这看起来像是一个"黑客"。我觉得DeserializeFromString应该能够处理字符串末尾的回车。好的一面是,当我在OSX上运行相同的代码时,它工作得非常好,因为文件现在是Unix格式,只使用换行,而不是回车和换行的组合。

还有人看到这个吗?除了我提到的那些,还有什么建议的修复方法吗?

为了向自己证明这一点,我写了一个简单的测试(Windows和OSX都失败)。

我的DTO

:

    class DeserializeTestData
    {
        public int someData { get; set; }
        public String moreData { get; set; }
    }
我测试:

    [Test]
    public void ShouldNotContainNullItemsWhenDeserializing()
    {
        var deserializeMe = "['r'n't{'r'n't't'"someData'": 1,'r'n't't'"moreData'": '"I'm data!'r'nokok'r'n'"'r'n't't},'r'n't{'r'n't't'"someData'": 2,'r'n't't'"moreData'": '"I'm also some data!'"'r'n't't}'r'n]'r'n";
        var rows = ServiceStack.Text.JsonSerializer.DeserializeFromString<DeserializeTestData[]>(deserializeMe);
        foreach (var row in rows)
        {
            Assert.That(row, Is.Not.EqualTo(null));
        }
    }
结果:

Test Name:  ShouldNotContainNullItemsWhenDeserializing
Test Outcome:   Failed
Test Duration:  0:00:00.125
Result Message: 
Expected: not null
   But was:  null

当对DTO数组使用servicestack deserializationToString时,空对象位于列表的末尾

操作'r'n等的输入值变得危险。而且,JsConfig也没有涉及到在反序列化时忽略空值的设置。

最好的选择是忽略后反序列化值中的空行。

var nonNullRows = rows.Where(r => r != null).ToList();

不是最优雅的,但在条件下,应该做的工作。