servicestack-text,C#,Null,Carriage Return,Json Deserialization,servicestack Text" /> servicestack-text,C#,Null,Carriage Return,Json Deserialization,servicestack Text" />

C# 当使用servicestack反序列化字符串到DTO数组时,一个空对象位于列表的末尾

C# 当使用servicestack反序列化字符串到DTO数组时,一个空对象位于列表的末尾,c#,null,carriage-return,json-deserialization,servicestack-text,C#,Null,Carriage Return,Json Deserialization,servicestack Text,我正在Visual Studio 2013上用C#进行编码,并尝试使用ServiceStack 3.9.71对一些JSON进行反序列化。它们包含在文件中(不在我的控制之下),当我尝试反序列化它时,我会得到正确的DTO数组,但另外,在数组的末尾有一个null对象。我已将其缩小为文件末尾的回车(“\r”)。我可以做的一些解决方案是修剪字符串,或者删除所有的“\r”,或者在GIT中禁用CRLF自动切换,并且在提交时非常勤奋,然而,我觉得这似乎是一个“黑客”。我觉得反序列化FromString应该能够处

我正在Visual Studio 2013上用C#进行编码,并尝试使用ServiceStack 3.9.71对一些JSON进行反序列化。它们包含在文件中(不在我的控制之下),当我尝试反序列化它时,我会得到正确的DTO数组,但另外,在数组的末尾有一个null对象。我已将其缩小为文件末尾的回车(“\r”)。我可以做的一些解决方案是修剪字符串,或者删除所有的“\r”,或者在GIT中禁用CRLF自动切换,并且在提交时非常勤奋,然而,我觉得这似乎是一个“黑客”。我觉得反序列化FromString应该能够处理字符串末尾的回车。更光明的一面是,当我在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
我的测试:

    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等的输入值变得很危险。 另外,afaik、JsConfig不涉及在反序列化时忽略空值的设置

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

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

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

是的,我觉得这是另一种“黑客”方式。最终我觉得我将不得不使用这些方法中的一种,但我只是惊讶于反序列化程序没有一点更健壮。谢谢你的建议!