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

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

新規登録して質問してみよう
ただいま回答率
85.50%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

C#

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

JSON

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

1回答

1725閲覧

jsonファイルの内容を表示できるのか?

j-nagnn

総合スコア21

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

C#

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

JSON

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2020/05/21 08:58

編集2020/05/21 10:03

ASP.NET MVCで、JSONファイルをserializeしたオブジェクトをcontrollerで、アラートや出力ウインドウなどで表示できるかを試しているのですが、返ってくるのはNULL値ばかりです。

View内で手打ちした内容は持ってきているのですが、ファイルから読み込んだものは持ってきていないようです。

ファイルを見てみると、中で、階層構造となっているっぽくて、Model部分で定義されているクラスのデータを構造化すればいいんじゃないかというアドバイスをもらったのですが、調べてみても、構造化の宣言した後にクラスの宣言をしたサンプルがのっている記事はありませんでした。

(前述の解決方法が正しいかはさておき)JSONファイルの内容をserializeしたオブジェクトをコントローラに持っていけるような解決策を教えて欲しいです。

開発環境: Visualstudio2017 .NETFramework4.6
言語: ASP.NET MVC C#
使用ツール:DHTMLX Gantt (URL:https://docs.dhtmlx.com/gantt/ )

【コード】
<index.cshtml>

Javascript

1<script type="text/javascript" > 2function jsonExport() { 3var json = new Object(); 4json = gantt.serialize('json'); 5var gnt = JSON.stringify(json.data); 6alert(gnt); 7var aj = '@Url.Action("JSONTest")'; 8 9$.ajax( 10{ 11type: 'POST', 12url: aj, 13data: gnt, 14dataType: 'json', 15contentType: 'application/json', 16 17error: function () { }, 18complete: function (data) { alert(data.responseText) } 19} 20); 21} 22</script>

[HomeControllers.cs]

C#

1public ActionResult JSONTest(Data viewModel,Object son) 2{ 3string[] vs = new string[4]; 4vs[0] = viewModel.Text; 5vs[1] = viewModel.StartDate.ToString(); 6vs[2] = viewModel.EndDate.ToString(); 7vs[3] = viewModel.Duration.ToString(); 8return Json(vs); 9}

[Data.cs(Model)]

C#

1namespace GantDHT.Models 2{ 3public class Data { 4 5public int Id { get; set; } 6public string Text { get; set; } 7public DateTime StartDate { get; set; } 8public DateTime EndDate { get; set; } 9public int Duration { get; set; } 10} 11}

【gntの内容】
[{"id":1,"text":"project #1","start_date":"2020-05-06","end_date":"2020-05-26","user":3,"duration":20,"parent":0,"progress":0},
{"id":2,"text":"Task #1","start_date":"2020-05-06","end_date":"2020-05-16","user":0,"duration":10,"parent":1,"progress":0},
{"id":3,"text":"Task #2","start_date":"2020-05-16","end_date":"2020-05-26","user":0,"duration":10,"parent":1,"progress":0}]

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/05/21 09:04

コードは ``` と ``` で囲ってください。インデントされて見やすくなるので。インデントされてないコードは質問者さん自身も読む気がしないのでは? 赤の他人の回答者・閲覧者はなおさらです。読んでもらえる努力をしてください。
退会済みユーザー

退会済みユーザー

2020/05/21 09:08

以前のようにコメントや回答にフィードバックを返さないということは止めましょう。そこは今後改善してもらえますか?
j-nagnn

2020/05/21 09:10

分かりました。改善するようにします。
退会済みユーザー

退会済みユーザー

2020/05/21 09:16

ではまずコードは ``` と ``` で囲ってください。
j-nagnn

2020/05/21 09:26

直させていただきました。見やすくなったでしょうか?
退会済みユーザー

退会済みユーザー

2020/05/21 09:38

画像の「localhost:62353 の内容」というのは何なのですか? この JSON 文字列を jQuery ajax を使ってアクションメソッド JSONTest に送信し、JSON 文字列を C# のオブジェクトにデシリアライズして引数にモデルバインドできればいいのですか? であれば、「localhost:62353 の内容」を画像でなく、コピペしてメモ帳などに張り付けられるようにテキストにしてください。
j-nagnn

2020/05/21 09:46

>>この JSON 文字列を jQuery ajax を使ってアクションメソッド JSONTest に送信し、JSON 文字列を C# のオブジェクトにデシリアライズして引数にモデルバインドできればいいのですか? 引数のオブジェクトは、それを入れないと、JSON文字列が入れられないのかと思い何となく追加しました。現段階では、配列vs[]に"text"や"startdate"のデータを格納したいです。 (無知を承知の上で聞きます)デシリアライズして引数にモデルバインドしないと実現できないのですか?
j-nagnn

2020/05/21 09:58

>>「localhost:62353 の内容」を画像でなく、コピペしてメモ帳などに張り付けられるようにテキストにしてください。 テキストベースに直しました
退会済みユーザー

退会済みユーザー

2020/05/21 09:59

jQuery ajax のコードの data: gnt, の gnt が「localhost:62353 の内容」の JSON 文字列だと思っていたのですが、違うのですか? 違うのであれば gnt に代入される文字列を書いてください。
j-nagnn

2020/05/21 10:02

>>data: gnt, の gnt が「localhost:62353 の内容」の JSON 文字列だと思っていたのですが、違うのですか? いえ、その認識であってます
退会済みユーザー

退会済みユーザー

2020/05/21 10:55

「localhost:62353 の内容」の JSON 文字列には id 1 ~ 3 の 3 つの要素が含まれていますが、質問に書いてあるコードでは一つだけ Data というクラスにデシリアライズすることを考えているのですよね。そこはどうしたいのですか?
j-nagnn

2020/05/21 11:01

出来れば3つとも、デシリアライズしたいです。
退会済みユーザー

退会済みユーザー

2020/05/21 11:18

コレクションのモデルバインディングは普通に View から POST すれば可能ですが、jQuery ajax で JSON を送信してということですと無理っぽいです。(自分が知らないだけという可能性は否定しきれませんが。カスタムモデルバインダとかを使えば可能かもしれませんけど) 一つずつという方法なら紹介できますが、それでは意味がないですか?
退会済みユーザー

退会済みユーザー

2020/05/21 12:47

どうしても 3 つともということであれば、【gntの内容】を文字列としてそのまま POST し、アクションメソッドの内部で Newtonsoft.Json とか JavaScriptSerializer を使って List<T> 型のオブジェクトにデシリアライズするという方法も考えられます。 どうするかよく考えてフィードバックください。
j-nagnn

2020/05/21 12:59

複数のデータを送りたいので「【gntの内容】を文字列としてそのまま POST し、アクションメソッドの内部で Newtonsoft.Json とか JavaScriptSerializer を使って List<T> 型のオブジェクトにデシリアライズする」方法がいいのかもしれないです。
退会済みユーザー

退会済みユーザー

2020/05/21 13:24

3 つとも取得する方向でもう少し考えてみました。アクションメソッドの内部で Newtonsoft.Json とか JavaScriptSerializer を使って List<T> 型のオブジェクトにデシリアライズという必要はなかったです。後で回答欄にやり方を書いておきます。
j-nagnn

2020/05/21 13:35

ありがとうございます。 もし、Nuget等でインストールするものがあれば教えていただけると幸いです。
退会済みユーザー

退会済みユーザー

2020/05/21 13:49

> Nuget等でインストールするものがあれば教えていただけると幸いです。 それは必要ないです。
guest

回答1

0

ベストアンサー

質問に書いてある【gntの内容】の JSON 文字列には 3 つのオブジェクトが含まれていますが、それを POST してアクションメソッドの引数に List<T> 型のオブジェクトにデシリアライズしてモデルバインドするやり方を書きます。

まず List<T> の T クラスの定義が必要ですが、それは Visual Studio を使って生成できます。詳しくは以下の記事を見てください。

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

以下のようになります。start_date, end_date は string 型となっていますが、JSON の value に直接設定できるのは string, number, object, array, true, false, null だけなので、JavaScript の Date オブジェクトや .NET Framework の DateTime オブジェクトは string にせざるを得ないということに注意してください。

public class Rootobject { public Class1[] Property1 { get; set; } } public class Class1 { public int id { get; set; } public string text { get; set; } public string start_date { get; set; } public string end_date { get; set; } public int user { get; set; } public int duration { get; set; } public int parent { get; set; } public int progress { get; set; } }

質問者さんの JavaScript のコードの data: gnt, の gnt が【gntの内容】の JSON 文字列(文字列という点に注意)で、それがそのままアクションメソッド JSONTest に送信されると理解していますが、その場合引数を List<Class1> 型にすれば 3 つのオブジェクトがその引数にモデルバインドされるはずです。

一応自分の環境で検証しましたが、以下のように期待通りモデルバインドされています。

イメージ説明

お試しください。

投稿2020/05/21 13:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

j-nagnn

2020/05/21 14:27

検証までしていただきありがとうございます。 後程試させていただきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問