ContentResultは僕のヒーローだった

本ページにはプロモーションが含まれています。

お仕事

ただの備忘録。Azure FunctionsをバックエンドAPIとして構築してるときの話。

フロントエンドにはJSONを返してたんですが、フロントに引き渡したくないデータもあるわけでして。

例えば以下のようなクラスがあるとします。

パスワードとかはフロントに引き渡す必要ないので、JsonIgnoreつけてJsonSerialize時に出力されないようにマークすると思うのです。

で、このオブジェクトを以下のようなAzure Functionsバックエンドから返していました。

ただ、このコード、問題がありまして・・・。

実はObjectResult自体がJSONに変換かけてくれるにも関わらず、その前にJsonSerializeしてしまっているのです。

なので二重にJsonSerializeされたものがフロントに渡っていたという。こんな感じで。

なんか文字列になってるし、エディタでみると変にエスケープされてたりとひっちゃかめっちゃか。

.NETのC#でSystem.Text.JsonでParseしようにも全く思い通りにならずに気付きましたw・・・。フロント側(JavaScript)ではいい感じで頭とおしりのダブルクォーテーションを取り除いてよしなにしてくれていたっぽい・・・。ありがたやw

そもそも単テの段階で気づけよとか突っ込みどころは満載なんですがそれはさておき。

じゃぁ、JsonSerializeやめればいーじゃんと。ほいで35行目のJsonSerializeをやめてObjectResultのコンストラクターの引数にUserオブジェクトのインスタンスを渡してみる。

お、今度はいい感じにJSONになってる。なってるぅ。

って、渡しちゃあかんやつ、いっちゃってる!!

これはだめだ。やっぱJsonSerializer通してIgnoreさせるのはマスト。

ってことで、どーすりゃ最小限の修正規模でコード改修できんの?って2日ほど悩み続けてしまいました。

Azure Functionsが返しているIActionResult型をHttpResponseMessage型を返すようにすればうまくいくまではたどり着いたのですが、数あるバックエンド関数の戻り値の型をすべて直すのはちょいとインパクト大。

ってことでやっぱりIActionResultインターフェースのオブジェクトがベストと判断。

でJsonResultやObjectResultでSerializeを無効にできないかとか、一度JsonSerializeしてIgnoreされたJsonをもう一回Deserializeしたのを・・・などなどありとあらゆる方法試行錯誤してみたがいまいちわからん。うまくいかない。パッとしない。

そこで白羽の矢が立ったのがタイトルにもある、ContentResultさん。

ソースコードのObjectResultをContentResultに変えたのが以下のコード。

そして、ContentResultに変更して返されたレスポンスはこちら。

おー、ばっちり!ただ、今回はJsonSerializerOptionsを指定して、返すJSONのプロパティをcamelケースに設定しています。一応、改行、漢字対応のオプションも入れてみました。

ひとまずContentResultのおかげで助かりました。僕のヒーロー、ヘビロテ決定です。


システムエンジニアランキング

にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

コメント

タイトルとURLをコピーしました