問題タブ [servicestack-text]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
servicestack - HttpResult の ToOptimizedResult によって StackOverflow 例外が発生する
v3.9.56.0 を使用していますが、サービスからToOptimizedResult
返された (自分のサービス ランナーから呼び出された)を呼び出すと、スタック オーバーフロー例外が発生しHttpResult
ます。さらに深く掘り下げると、例外が から来ていることがわかりましたJsonSerializer
。
返されるコードのスニペットは次のとおりです。
c# - ServiceStack の JSON デシリアライザーが無効な JSON を解析する
無効な JSON テキスト が与えられた場合、{ "foo" = "bar" }
ServiceStack に組み込まれている JSON デシリアライザーは、これを次の DTO に正常にデコードします。
これは、C# のイニシャライザーのように見えるため、一部のユース ケースでは許容される可能性があります。JSON を実際に解析しないことは、このライブラリの機能です。
ただし、無効な JSON テキストを指定すると{ "foo" xxx "bar" }
、エラーはスローされず、恐ろしいことに Foo プロパティが「xxx」に設定されます。
(a) JSON のみを解析するように ServiceStack.Text を構成する方法 (デフォルトで受け入れられる非標準のバリアントではなく)、または (b) アプリケーション レベルでシリアライザーをたとえば JSON.NET に置き換える方法はありますか?
編集: また、Web ルーティング コードに対する ServiceStack の逆シリアル化動作は、無効な解析でServiceState.Text.JsonSerializer
返されるように見える動作とは異なるように見えます。default(T)
編集 2 (進行状況?):
このオプションを設定すると、ServiceStack は不正な形式の JSON に対して 400 Bad Request を返しますが、残念ながら JSON を指定された DTO に逆シリアル化することはできません。多分これは解決策の一部ですか?
解決:
ServiceStack のデフォルトの JSON シリアライザーをカスタムの "application/json" ハンドラーに置き換えて、JSON.NET シリアライザーをラップすると、問題が解決しました。以下の回答にソリューションコードのコピーを含めました。お役に立てば幸いです。
c# - servicestack deserializationToString を DTO 配列に使用すると、null オブジェクトがリストの最後にある
Visual Studio 2013でC#でコーディングしており、 ServiceStack 3.9.71を使用して JSON を逆シリアル化しようとしています。. それらはファイルに含まれており(私の管理下ではありません)、それを逆シリアル化しようとすると、最終的にDTOの正しい配列になりますが、配列の最後にnullオブジェクトがあります。ファイルの最後にあるキャリッジ リターン ("\r") に絞り込みました。私ができるいくつかの解決策は、文字列をトリミングするか、すべての「\ r」を削除するか、GIT で CRLF 自動スイッチを無効にして、コミットするときに非常に勤勉になることですが、それは「ハック」のように感じます。DeserializeFromString は、文字列の末尾にあるキャリッジ リターンを処理できるはずだと思います。明るい面では、OSX で同じコードを実行すると、ファイルが改行のみを使用し、改行と改行の組み合わせを使用しない Unix 形式になっているため、完全に正常に動作します。
他の誰かがこれを見たことがありますか?私が言及したもの以外に推奨される修正はありますか?
それを証明するために、簡単なテストを作成しました (Windows と OSX の両方で失敗します)。
私のDTO:
私のテスト:
結果:
c# - ServiceStack.Text.EnumMemberSerializer が Swagger プラグインで動作しない
ServiceStack v 3.9.71 とServiceStack.Text.EnumMemberSerializer
アセンブリを使用して、列挙型を読み取り可能なテキストにシリアル化しています。
これはうまく機能し、列挙型の値は、 を使用して指定した名前にシリアル化されますEnumMemberAttribute
。
ただし、問題は、Swagger が私の名前を使用しないことです。私の推測では.ToString()
、値ではなく列挙値でメソッドを呼び出すだけEnumMemberAttribute
です。
シリアライゼーションを設定する順序は次のとおりです。(AppHost 内):
Swagger 機能が追加される前または後に enum シリアライザーが設定されているかどうかは問題ではないようです。
c# - ServiceStack.Text でオープン ジェネリック型のカスタム (デ) シリアライザーを設定することは可能ですか?
私はこのようなタイプを持っています:
ToJson
Foo<Bar>
微調整では実現不可能な方法で、インスタンスを JSON にシリアライズしますJsConfig
。また、ToJson
ServiceStack.Text に依存してシリアライズします。Nested
これは のインスタンスになる可能性がありますFoo<Baz>
。
残念ながら、JsConfig
実装されている方法は、 forおよび other forJsConfig<T>
の静的変数のセットがあることを意味します。また、AFAIK、ServiceStack.Text は、オープン ジェネリック型 (つまり、のようなもの) の JSON シリアル化を構成する方法を提供しません。この静的コンストラクターを作成して、この問題を解決しようとしました:Foo<Bar>
Foo<Baz>
JsConfig.Add(typeof(Foo<>), config)
Foo<T>
これは常に機能するわけではありません。これは、静的コンストラクターがランタイムによって呼び出される順序によって異なります。どうやら、 ServiceStack.Text はシリアライザー関数をキャッシュし、API で操作が呼び出される順序に応じて、静的コンストラクターが呼び出される前にそれを実行することがあります。
JsConfig<Foo<T>>
T は実質的に任意の型 (他のジェネリック型であっても) になる可能性があるため、事前にすべてのシリアライザーを設定することはできません。
ServiceStack.Text でオープン ジェネリック型 (ネストできる) のカスタム シリアル化ルーチンを定義することは可能ですか?
json - ServiceStack.Text: Linq と ConvertAll を使用する
ServiceStack.Text JsonObject パーサーを使用してドメイン モデルにマップしています。Linq を使用して ArrayObject をフィルタリングし、convertAll を使用して変換しようとする場合を除いて、基本的に何かが機能しています。リンクを使用した後、要素ごとに JsonArrayObjects リストに追加してから渡すことはできません。
質問: IEnumarable から JsonArrayObjects に戻すより洗練された方法はありますか? where は古いものを操作する代わりに要素をリストにコピーするため、キャストは機能しません。したがって、結果はダウンキャストされた JsonArrayObjects ではなく、新しい List オブジェクトになります。
一番
c# - デシリアライズ時にServiceStack JsonServiceClientがサイレントに失敗する
Expedia API との統合に取り組んでいます。私は ServiceStack に比較的慣れていませんが、これまでのところかなりうまく管理していますが、API からの JSON 応答の逆シリアル化で問題が発生し、JsConfig.ThrowOnDeserializationError
有効にしているにもかかわらず失敗しているようです。
私が取り組んでいる API レスポンスを表示するには、次のリクエストを使用してください。
典型的な応答は次のとおりです。
私が本当に興味を持っているすべてのレート情報を除いて、応答の大部分は問題なくデシリアライズされています。より具体的には、ChargeableRateInfo を取り上げてみましょう。含まれるすべての値は null またはゼロです。
応答を逆シリアル化しようとしているクラスは次のとおりです。
これは、JSON の @ 記号と関係がある可能性があります。もしそうなら、どうすればこれを回避できますか?