当对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
操作'r'n等的输入值变得危险。而且,JsConfig也没有涉及到在反序列化时忽略空值的设置。
最好的选择是忽略后反序列化值中的空行。
var nonNullRows = rows.Where(r => r != null).ToList();
不是最优雅的,但在条件下,应该做的工作。