繁体   English   中英

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

[英]When using servicestack deserializationToString to a DTO array, a null object is at the end of the list

我正在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

操纵\\ r \\ n等的输入值变得很容易。 另外,同样,JsConfig不涉及在反序列化时忽略空值的设置。

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

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

不是最优雅的,而是有条件的,应该做的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM