無効な JSON テキスト が与えられた場合、{ "foo" = "bar" }
ServiceStack に組み込まれている JSON デシリアライザーは、これを次の DTO に正常にデコードします。
public class FooDto {
public string Foo { get; set; }
}
これは、C# のイニシャライザーのように見えるため、一部のユース ケースでは許容される可能性があります。JSON を実際に解析しないことは、このライブラリの機能です。
ただし、無効な JSON テキストを指定すると{ "foo" xxx "bar" }
、エラーはスローされず、恐ろしいことに Foo プロパティが「xxx」に設定されます。
(a) JSON のみを解析するように ServiceStack.Text を構成する方法 (デフォルトで受け入れられる非標準のバリアントではなく)、または (b) アプリケーション レベルでシリアライザーをたとえば JSON.NET に置き換える方法はありますか?
編集: また、Web ルーティング コードに対する ServiceStack の逆シリアル化動作は、無効な解析でServiceState.Text.JsonSerializer
返されるように見える動作とは異なるように見えます。default(T)
編集 2 (進行状況?):
appHost.SetConfig(new HostConfig { UseBclJsonSerializers = true });
このオプションを設定すると、ServiceStack は不正な形式の JSON に対して 400 Bad Request を返しますが、残念ながら JSON を指定された DTO に逆シリアル化することはできません。多分これは解決策の一部ですか?
解決:
ServiceStack のデフォルトの JSON シリアライザーをカスタムの "application/json" ハンドラーに置き換えて、JSON.NET シリアライザーをラップすると、問題が解決しました。以下の回答にソリューションコードのコピーを含めました。お役に立てば幸いです。