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

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

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

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

C#

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

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

ASP.NET

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

Q&A

解決済

2回答

4176閲覧

不定形JSONを受領する場合のモデルの型

kencha

総合スコア2

.NET Core

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

C#

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

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

ASP.NET

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

0グッド

0クリップ

投稿2021/08/22 05:02

編集2021/08/22 05:36

前提・実現したいこと

C# / .net core 3.1 でREST APIサーバを作成しています。
json中にある一部のjsonが不定形の場合のモデル内宣言がわかりません。

POSTが以下の形できますが、DataのValueのJSONは不定で、DBにはシリアライズしてテキストで登録します。
例:
{"ID": "abcde", "Data": {"hoge": "h1", "fuga": "h2"} }
{"ID": "abcde", "Data": {"StartDate": "2021-01-01", "EndDate": "2021-03-31"}}
{"ID":"mghyts", "Data":{"Expired": "2021-03-25"}}
このDataは、アプリソフトがメタデータとして利用しており、GetされるとDataのJSONをそのまま返します。

コントローラーは
[HttpPost]
public async void Add(AddRequest request)
{
...
}

モデルクラスの定義でDataをなにで宣言していいのかがわかりません。
public class AddRequest
{
string ID {get; set;}
... Data {get; set;}
}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/08/22 05:22

ASP.NET アプリの話なら、ASP.NET のタグをつけてください。 > DataのValueのJSONは不定で、 { "name" : "value" } の name は Data で決まっていて、value が不定と理解していますが、その具体例を 2, 3 書いていただけませんか? 受け取って中身を見るまで value の中身は全く分からないのですか? とすると、どうやって value の中の目的の情報を取得できるのですか?
kencha

2021/08/22 05:30

タグのご指摘、ありがとうございます。 アプリソフトがメタデータとして利用しており、GetされるとJSONをそのまま返します。 サーバ側は内容に関知しません。 {"ID": "abcde", "Data": {"StartDate": "2021-01-01", "EndDate": "2021-03-31"}} だったり {"ID":"mghyts", "Data":{"Expired": "2021-03-25"}} だったりが今のところ予定されています。
退会済みユーザー

退会済みユーザー

2021/08/22 05:37 編集

上の情報は質問欄を編集して追記願います。このコメント欄は「質問への追記・修正」の場所ですし、初期画面では閉じているので見ない人もいますので。 > 予定されています。 予定ということは変更はできるのですか? であれば、以下のような形にして、データがないところは null とか空白にするということはできないのですか? {"ID": "abcde", "Data": {"StartDate": "2021-01-01", "EndDate": "2021-03-31", "Expired": null}}
kencha

2021/08/22 05:37

ご指摘、ありがとうございます。編集いたしました
退会済みユーザー

退会済みユーザー

2021/08/22 05:39

今から変更はできるのですか? たとえば、以下のような形にして、データがないところは null とか空白にするということはできないのですか? {"ID": "abcde", "Data": {"StartDate": "2021-01-01", "EndDate": "2021-03-31", "Expired": null}}
kencha

2021/08/22 05:48

全く違う2つの用途に使用され、データ形式もアプリ側都合で変更するためスキームを固定することができません。
退会済みユーザー

退会済みユーザー

2021/08/22 05:58

{ "name" : "value" } の name は Data で決まっているなら、JSON 文字列をパースして value を取得する方法はあります。それが質問者さんのケースで意味があるかどうかわかりませんが回答欄に紹介しておきます。
kencha

2021/08/22 06:05

keyはDataで確定しています。当初は [JsonExtensionData] Dictionary<string, string>... もあるらしいとさぐったのですが、配列なりネストなりする可能性がありそうなので回避いたしました。 「System.Text.Json でオーバーフロー JSON を処理するか、JsonElement または JsonNode を使用する方法」 https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/system-text-json-handle-overflow?pivots=dotnet-core-3-1 でいけるかなと試していますが、まだうまくいっていません。 ご紹介いただければ助かります。
guest

回答2

0

自己解決

SurferOnWww さんのご回答を参考にして試しました。

結論

C#

1public class AddRequest 2{ 3 string ID {get; set;} 4 System.Text.Json.JsonElement Data {get; set;} 5}

でいけました。

ユニットテストで、JsonElementは直接生成できませんので、テストデータ作成も少し手間でした。

投稿2021/08/22 10:05

kencha

総合スコア2

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

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

退会済みユーザー

退会済みユーザー

2021/08/22 11:47 編集

なるほど、モデルバインディングが問題だと思っていたのですが、それは気が付きませんでした。まるまる定義不明でも、 public class AddRequest { System.Text.Json.JsonElement Data {get; set;} } とかでバインドできるのかもしれませんね。試してみます。
退会済みユーザー

退会済みユーザー

2021/08/23 06:36

JSON 文字列がまるまる定義不明の場合は上のコメントに書いたようなモデルは使えなくて、アクションメソッドの引数を以下のようにしてやれば OK でした。 public IActionResult Post([FromBody] JsonElement postedObject)
guest

0

{ "name" : "value" } の name は Data で決まっているなら、JSON 文字列をパースして Data に対応する value を取得する方法はあります。それが質問者さんのケースで意味があるかどうかわかりませんが紹介しておきます。

.NET Core 3.x なら System.Text.Json の Deserialize メソッドで JSON 文字列を JsonElement 構造体のオブジェクトにデシリアライズし、その中から name が "Data" の value 値を再帰を使って JsonElement として取得できます。

具体例は以下の記事の「(2) JsonElement (System.Text.Json)」のサンプルコードを見てください。

JSON 文字列から指定した name の value を取得
http://surferonwww.info/BlogEngine/post/2021/02/11/find-value-by-name-in-json-string.aspx

Controller のアクションメソッドでの JSON 文字列の取得方法、取得した JsonElement から目的の情報を得るのがチャレンジかもしれませんが・・・

【追記】

取得した JsonElement は、中身は全く不定でも、バラすことはできます。具体例は以下の記事を見てください

System.Text.Json の JsonElement をパース (CORE)
http://surferonwww.info/BlogEngine/post/2021/02/08/parse-jsonelement-object-deserialized-by-deserialize-method-in-system-text-json.aspx

投稿2021/08/22 06:20

編集2021/08/22 06:29
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問