\r\n```\r\n[HomeControllers.cs]\r\n```C#\r\npublic ActionResult JSONTest(Data viewModel,Object son)\r\n{\r\nstring[] vs = new string[4];\r\nvs[0] = viewModel.Text;\r\nvs[1] = viewModel.StartDate.ToString();\r\nvs[2] = viewModel.EndDate.ToString();\r\nvs[3] = viewModel.Duration.ToString();\r\nreturn Json(vs);\r\n}\r\n```\r\n[Data.cs(Model)]\r\n```C#\r\nnamespace GantDHT.Models\r\n{\r\npublic class Data { \r\n\r\npublic int Id { get; set; }\r\npublic string Text { get; set; }\r\npublic DateTime StartDate { get; set; }\r\npublic DateTime EndDate { get; set; } \r\npublic int Duration { get; set; }\r\n}\r\n}\r\n```\r\n【gntの内容】\r\n[{\"id\":1,\"text\":\"project #1\",\"start_date\":\"2020-05-06\",\"end_date\":\"2020-05-26\",\"user\":3,\"duration\":20,\"parent\":0,\"progress\":0},\r\n {\"id\":2,\"text\":\"Task #1\",\"start_date\":\"2020-05-06\",\"end_date\":\"2020-05-16\",\"user\":0,\"duration\":10,\"parent\":1,\"progress\":0},\r\n{\"id\":3,\"text\":\"Task #2\",\"start_date\":\"2020-05-16\",\"end_date\":\"2020-05-26\",\"user\":0,\"duration\":10,\"parent\":1,\"progress\":0}]","answerCount":1,"upvoteCount":0,"datePublished":"2020-05-21T08:58:39.436Z","dateModified":"2020-05-21T10:03:09.982Z","acceptedAnswer":{"@type":"Answer","text":"質問に書いてある【gntの内容】の JSON 文字列には 3 つのオブジェクトが含まれていますが、それを POST してアクションメソッドの引数に List 型のオブジェクトにデシリアライズしてモデルバインドするやり方を書きます。\r\n\r\nまず List の T クラスの定義が必要ですが、それは Visual Studio を使って生成できます。詳しくは以下の記事を見てください。\r\n\r\nJSON 文字列から C# のクラス定義生成\r\n[http://surferonwww.info/BlogEngine/post/2020/05/10/generate-class-definition-from-json-string.aspx](http://surferonwww.info/BlogEngine/post/2020/05/10/generate-class-definition-from-json-string.aspx)\r\n\r\n以下のようになります。start_date, end_date は string 型となっていますが、JSON の value に直接設定できるのは string, number, object, array, true, false, null だけなので、JavaScript の Date オブジェクトや .NET Framework の DateTime オブジェクトは string にせざるを得ないということに注意してください。\r\n\r\n```\r\npublic class Rootobject\r\n{\r\n public Class1[] Property1 { get; set; }\r\n}\r\n\r\npublic class Class1\r\n{\r\n public int id { get; set; }\r\n public string text { get; set; }\r\n public string start_date { get; set; }\r\n public string end_date { get; set; }\r\n public int user { get; set; }\r\n public int duration { get; set; }\r\n public int parent { get; set; }\r\n public int progress { get; set; }\r\n}\r\n```\r\n\r\n質問者さんの JavaScript のコードの data: gnt, の gnt が【gntの内容】の JSON 文字列(**文字列という点に注意**)で、それがそのままアクションメソッド JSONTest に送信されると理解していますが、その場合引数を List 型にすれば 3 つのオブジェクトがその引数にモデルバインドされるはずです。\r\n\r\n一応自分の環境で検証しましたが、以下のように期待通りモデルバインドされています。\r\n\r\n\r\n\r\nお試しください。","dateModified":"2020-05-21T13:46:58.626Z","datePublished":"2020-05-21T13:46:58.626Z","upvoteCount":1,"url":"https://teratail.com/questions/263597#reply-378033"},"suggestedAnswer":[],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://teratail.com","name":"トップ"}},{"@type":"ListItem","position":2,"item":{"@id":"https://teratail.com/tags/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB","name":"ファイルに関する質問"}},{"@type":"ListItem","position":3,"item":{"@id":"https://teratail.com/questions/263597","name":"jsonファイルの内容を表示できるのか?"}}]}}}
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" >
2 function jsonExport ( ) {
3 var json = new Object ( ) ;
4 json = gantt . serialize ( 'json' ) ;
5 var gnt = JSON . stringify ( json . data ) ;
6 alert ( gnt ) ;
7 var aj = '@Url.Action("JSONTest")' ;
8
9 $ . ajax (
10 {
11 type : 'POST' ,
12 url : aj ,
13 data : gnt ,
14 dataType : 'json' ,
15 contentType : 'application/json' ,
16
17 error : function ( ) { } ,
18 complete : function ( data ) { alert ( data . responseText ) }
19 }
20 ) ;
21 }
22 < / script >
[HomeControllers.cs]
C#
1 public ActionResult JSONTest ( Data viewModel , Object son )
2 {
3 string [ ] vs = new string [ 4 ] ;
4 vs [ 0 ] = viewModel . Text ;
5 vs [ 1 ] = viewModel . StartDate . ToString ( ) ;
6 vs [ 2 ] = viewModel . EndDate . ToString ( ) ;
7 vs [ 3 ] = viewModel . Duration . ToString ( ) ;
8 return Json ( vs ) ;
9 }
[Data.cs(Model)]
C#
1 namespace GantDHT . Models
2 {
3 public class Data {
4
5 public int Id { get ; set ; }
6 public string Text { get ; set ; }
7 public DateTime StartDate { get ; set ; }
8 public DateTime EndDate { get ; set ; }
9 public 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}]
ベストアンサー
質問に書いてある【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 つのオブジェクトがその引数にモデルバインドされるはずです。
一応自分の環境で検証しましたが、以下のように期待通りモデルバインドされています。
お試しください。
15分調べてもわからないことは teratailで質問しよう!
ただいまの回答率 85.29%
質問をまとめることで 思考を整理して素早く解決
テンプレート機能で 簡単に質問をまとめる
質問する