Visual Studio 2013でC#でコーディングしており、 ServiceStack 3.9.71を使用して JSON を逆シリアル化しようとしています。. それらはファイルに含まれており(私の管理下ではありません)、それを逆シリアル化しようとすると、最終的にDTOの正しい配列になりますが、配列の最後にnullオブジェクトがあります。ファイルの最後にあるキャリッジ リターン ("\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