質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

1回答

409閲覧

GETリクエストのリターン内容を変数に格納したい & ASP.NET Models 定義の仕方

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2022/01/28 12:30

実現したいこと

  • GETリクエストを出し、リターン内容を変数に格納したい

概要

  • ASP.NET Core 使用
  • GETリクエスト 200 OK
  • フォーマット例

JSON

1{ 2 "Name": "太郎", 3 "Code": 32, 4 "SubjectScores": [Array] { 5 "Subject": "数学", 6 "Score": 87 7 }, 8}

質問

  • 上記のGETリクエストを受信するためにModelsに下記の形で定義しました。

Models

1namespace Sample.Models{ 2 public class PersonalInfo { 3 public string Name; 4 public int Code; 5 public SubjectScores subjectScores; 6 } 7 8 public class SubjectScores { 9 public string Subject; 10 public int Score; 11 } 12}

Controller

1Stream personalInfoStream = /*GETリクエストを出す関数 200 OK*/; 2Models.PersonalInfo personalInfo; 3var personalInfoSerializer = new DataContractJsonSerializer(typeof(Models.PersonalInfo)); 4personalInfo = ( Models.PersonalInfo ) personalInfoSerializer.ReadObject( personalInfoStream );

上記コーディングでpersonalInfoにJSONで取得したGETリクエストの結果が入ってくると思いましたが、実際は各項目がnullでした。
原因として推測しているのは以下です。

  • Modelsでの定義の仕方が正しくない
  • JSONを変数に移すためにはDataContractJsonSerializerの他に必要な処理がある

そうであればどのように記述する必要があるのか教えていただけませんでしょうか。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/01/28 12:51

全く意味不明。ネタとかではないかと疑われるレベルですけど・・・。
退会済みユーザー

退会済みユーザー

2022/01/29 00:55 編集

意味不明な最たるところを書いておきますので、本気で問題・課題を解決したいなら、それを参考に質問を書き直して下さい。 表題の、 > GETリクエストのリターン内容を変数に格納したい から「概要」までを読むと、やりたいことは、 (1) クライアントから HTTP GET 要求を出すと ASP.NET Core Web アプリが「概要」に書いてあるような JSON 文字列を返すので、それをクライアント側で受けてデシリアライズしてクライアントアプリの変数に格納したい。 ・・・と思ったが、「質問」以降を読むと、 (2) クライアントから「概要」に書いてある JSON 文字列を送信し(であれば、GET ではなく POST とすべきだが)、ASP.NET Core Web アプリでそれを受けて C# のオブジェクトにデシリアライズして Controller のアクションメソッドの引数に渡したい。 ・・・と思われ、質問が矛盾&意味不明になってます。 まず、(1) or (2) どっちなのかを書く。(1) ならクライアントのアプリが何なのかを書く、(2) なら GET でなく POST に直す。「概要」の JSON 文字列が正しくないので見直す。Model も正しくないので見直す。DataContractJsonSerializer など使わないのでそこも見直す・・・ということを、質問欄を編集して書いてください。
guest

回答1

0

質問者さんはこのスレッドを放棄して去ってしまったようで、質問のコメントに対する返事がありませんが、たぶんやりたいことは (2) すなわち、

(2) クライアントから「概要」に書いてある JSON 文字列を送信し(であれば、GET ではなく POST とすべきだが)、ASP.NET Core Web アプリでそれを受けて C# のオブジェクトにデシリアライズして Controller のアクションメソッドの引数に渡したい。

・・・だろうと想像して、質問のコメントに書いたように (2) なら GET でなく POST に直す、「概要」の JSON 文字列が正しくないので見直す、Model も正しくないので見直す、DataContractJsonSerializer など使わないのでそこも見直す、ということで回答を書いておきます。

JSON 文字列。質問のは JSON として正しくないので以下に修正:

{ "Name": "太郎", "Code": 32, "SubjectScores": [{"Subject": "数学","Score": 87},{"Subject": "英語","Score": 90}] }

それをベースに C# のクラス定義を作成:

public class Rootobject { public string Name { get; set; } public int Code { get; set; } public Subjectscore[] SubjectScores { get; set; } } public class Subjectscore { public string Subject { get; set; } public int Score { get; set; } }

Visual Studio のツールを使って作成できます。詳しくは以下の記事を見てください。

JSON 文字列から C# のクラス定義生成
http://surferonwww.info/BlogEngine/post/2020/05/10/generate-class-definition-from-json-string.aspx

上の JSON 文字列を受けるアクションメソッド。シリアライザはフレームワークに備わっており、自分で DataContractJsonSerializer などを使うコードを書く必要はありません。

[HttpPost] public IActionResult Recieve([FromBody]Rootobject personalInfo) { var name = personalInfo.Name; var code = personalInfo.Code; var subjectscores = personalInfo.SubjectScores; var subject = subjectscores[0].Subject; var score = subjectscores[0].Score; return Ok("処理完了"); }

ASP.NET Core MVC では引数に [FromBody] を付与するのは必須です。詳しくは以下の記事を見てください。

MVC に JSON をバインドするには [FromBody] が必要 (CORE)
http://surferonwww.info/BlogEngine/post/2021/04/12/frombodyattribute-is-required-for-model-binding-json-to-action-method-of-mvc.aspx

以上でクライアントから正しく上の JSON 文字列を POST 送信すればアクションメソッドの引数にデシリアライズされた C# のオブジェクトを受け取ることができます。

クライアントに、例えば、Fiddler を使って以下のように送信できます。要求ヘッダに Content-Type: application/json を設定するのは必須ですので忘れないように。

イメージ説明

Visual Studio のデバッガを使って以下のように JSON 文字列をデシリアライズした結果がアクションメソッドの引数に代入されることは確認できます。

イメージ説明

投稿2022/02/02 03:53

編集2022/02/02 12:12
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/02/02 03:55

また画像が投稿できないという不具合が出ているようです。解決したら回答を修正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問