0

我在C#的Visual Studio 2013編碼的結束,我想利用反序列ServiceStack 71年3月9日一些JSON。它們包含在文件中(不在我的控制之下),當我嘗試反序列化它時,我最終得到了正確的DTO數組,但是另外,在數組末尾有一個空對象。我已經縮小到文件末尾的回車符(「\ r」)。我可以做的一些解決方案是修剪字符串,或者刪除所有的「\ r」,或者禁用GIT中的CRLF自動切換,並且在提交時只是非常勤奮,但是,我覺得這看起來像是「黑客」。我覺得DeserializeFromString應該能夠處理字符串末尾的回車符。在更光明的一面,當我在OSX上運行相同的代碼時,它工作得很好,因爲該文件現在是Unix格式,只使用換行符,而不是回車和換行符的組合。當使用servicestack deserializationToString到DTO數組,空對象是在列表

有沒有其他人看到過這個?除了我提到的那些之外,還有哪些建議的修復?爲了證明這一點,我寫了一個簡單的測試(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 

回答

0

操縱輸入值f或\ r \ n等等變得危險。 也,afaik,JsConfig不涉及設置忽略反序列化的空值。

最佳可用選項是在後反序列化值中忽略空行。

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

不是最優雅的,但根據條件,應該做的工作。

+0

是的,我覺得這是另一種「黑客」的方式。最終,我覺得我將不得不使用其中的一種方法,但我感到驚訝的是,解串器並沒有更強大。感謝您的建議! – user3474077

相關問題