簡體   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