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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

11366閲覧

【C#】 WEBAPIのPOSTでJSON配列を受け取る方法について

suzuki999

総合スコア8

Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/08/24 07:55

編集2020/08/25 02:08

やりたいこと

C#のWEBAPIでPOSTされてきたJSON配列を受け取りたい

単一のJSONファイルを受け取るAPIはできたのですが、複数のJSONが格納されたJSON配列をブラウザから受け取る方法が分かりません。
「Jig」というエンティティクラスを作成し、DBコンテキストに登録しています。
「JSON配列をJigクラス型を引数としたAPIに渡すにはAPI側のどこをどう変更すればいいか」が知りたいです。

C#でWEBAPIの作成経験のある方、アドバイスを頂ければと思います。

os:windows10
ide:visual studio2019
バックエンド:ASP.NET Core WEBAPI 3.0 Entity Framework
フロントサイド:Javascript(Vue.js)  ※ソース未記載

ソースコード

C#

1 [HttpPost("insert")] 2 [ProducesResponseType(typeof(Jig), StatusCodes.Status201Created)] 3 [ProducesResponseType(StatusCodes.Status400BadRequest)] 4 public async Task<ActionResult<Jig>> InsertJig(Jig jig) 5 { 6 7 try 8 { 9 _logger.LogInformation("InsertJig Start"); 10 11 if (JigParamCheck(jig) != 0) 12 { 13 return BadRequest(); 14 } 15 16 //テーブルのデータをSelectする 17 var Jig = await _context.Jig 18 .Where(s => s.Po == jig.Po && s.PoSub1 == jig.PoSub1 19 && 20 s.IsDeleted != ConstItem.CD_DATA_CNTL_DEL) 21 .FirstOrDefaultAsync(); 22 23 if (Jig == null) 24 { 25 var insertJig = new Jig() 26 { 27 Po = jig.Po, 28 PoSub1 = jig.PoSub1, 29 PoSub2 = jig.PoSub2, 30 Remark = jig.Remark, 31 IsDeleted = ConstItem.CD_DATA_CNTL_NEW, 32 CreatedAt = DateTime.Now, 33 CreatedUserId = HttpContext.User.Identity.Name, 34 UpdatedAt = DateTime.Now, 35 UpdatedUserId = HttpContext.User.Identity.Name 36 }; 37 38 _context.Jig.Add(insertJig); 39 await _context.SaveChangesAsync(); 40 41 _logger.LogInformation("InsertJig Insert Finish"); 42 43 return CreatedAtAction(CD_TRANS_INSERT, new { id = insertJig.Po }, insertJig); 44 } 45 else 46 { 47 throw new Exception("すでに値が存在します!!!"); 48 } 49 } 50 catch (Exception ex) 51 { 52 _logger.LogError(ex, "InsertJig Error"); 53 throw ex; 54 } 55 }

上記ソースコードを実行しSwagger上でJSON配列をポストした際、以下のエラー文が出ます。

{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "|768239e9-4a798d95973baa0b.", "errors": { "$": [ "',' is invalid after a single JSON value. Expected end of data. Path: $ | LineNumber: 10 | BytePositionInLine: 1." ] } }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/08/24 08:29

何を作っているか(ASP.NET Web API? ASP.NET MVC? その他?)と開発環境(OS. Visual Studio のバージョン、.NET or Core どっちかとそのバージョン)ぐらいは書こう。
BluOxy

2020/08/24 10:38 編集

JigクラスがJson文字列にシリアライズできるかどうか判断できません。開発環境もですが、Jigクラスの定義も記載お願いします。
退会済みユーザー

退会済みユーザー

2020/08/25 02:42

ASP.NET のタグをつけてください。 クライアントから送信されてきた JSON 文字列をサーバーで受け取って、アクションメソッドの引数 jig にバインドできればいいのですよね? であれば、Jig クラスの定義(コード)と JSON 文字列のサンプルを質問欄を編集して追記してください。
guest

回答2

0

自己解決

まず、閲覧/コメント頂いた皆様ありがとうございました。
自己解決に至りましたので、修正した点を記載してCloseとさせていただきます。

## 修正した点

①APIの引数を配列に
②ループ内で各配列の内容を「insertJig」へ格納しInsertするように
③CreatedAtActionをループ外で記述するように

C#

1 [HttpPost("insert")] 2 [ProducesResponseType(typeof(Jig), StatusCodes.Status201Created)] 3 [ProducesResponseType(StatusCodes.Status400BadRequest)] 4 public async Task<ActionResult<Jig>> InsertJig(Jig[] jig) 5 { 6 7 try 8 { 9 10 _logger.LogInformation("InsertJig Start"); 11 12 if (jig.Length == 0) 13 { 14 return BadRequest(); 15 } 16 else 17 { 18 19 20 for (int i = 0; i < jig.Length; i++) 21 { 22 if (JigParamCheck(jig[i]) != 0) 23 { 24 return BadRequest(); 25 } 26 27 //テーブルのデータをSelectする 28 var Jig = await _context.Jig 29 .Where(s => s.Po == jig[i].Po && s.PoSub1 == jig[i].PoSub1 30 && 31 s.IsDeleted != ConstItem.CD_DATA_CNTL_DEL) 32 .FirstOrDefaultAsync(); 33 34 if (Jig == null) 35 { 36 var insertJig = new Jig 37 { 38 Po = jig[i].Po, 39 PoSub1 = jig[i].PoSub1, 40 PoSub2 = jig[i].PoSub2, 41 Remark = jig[i].Remark, 42 IsDeleted = ConstItem.CD_DATA_CNTL_NEW, 43 CreatedAt = DateTime.Now, 44 CreatedUserId = HttpContext.User.Identity.Name, 45 UpdatedAt = DateTime.Now, 46 UpdatedUserId = HttpContext.User.Identity.Name 47 }; 48 49 _context.Jig.Add(insertJig); 50 await _context.SaveChangesAsync(); 51 52 53 54 //return CreatedAtAction(CD_TRANS_INSERT, new { id = insertJig.Po }, insertJig); 55 } 56 else 57 { 58 throw new Exception("すでに値が存在します!!!"); 59 } 60 } 61 return CreatedAtAction(CD_TRANS_INSERT, new { id = jig[0].Po }, jig); 62 63 } 64 65 } 66 67 catch (Exception ex) 68 { 69 _logger.LogError(ex, "InsertJig Error"); 70 throw ex; 71 } 72 73 74 75 }

投稿2020/08/25 05:43

suzuki999

総合スコア8

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

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

0

Swagger上でJSON配列をポストした際、以下のエラー文が出ます。

具体的に、どんな JSON をポストしたのでしょうか?

投稿2020/08/25 03:21

hidori

総合スコア403

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問