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

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

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

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

JSON

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

Q&A

解決済

3回答

11170閲覧

[C#]入れ子になっているJSONのDTOの作り方がわからない

syosinsya_swift

総合スコア62

C#

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

JSON

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

0グッド

0クリップ

投稿2020/04/16 06:51

前提・実現したいこと

C#でJSONのDTOを作成しているのですが、
「list」部分の配列で且つ入れ子になっている場合の書き方がわからず、教えてください。

現在の書き方だと、メインクラスの「List = new List」部分でエラーとなってしまいます。
エラー:配列を指定するには配列のサイズまたは初期化子を指定する必要があります。

該当のソースコード

該当のJSONは以下です。listの部分は送信物によって行数が変動します。

{ "request": { "transaction": { "id" : "10", "server" : "10" }, "list" : [ { "group" : "1", "data" : "XXXXX" } ,{ "group" : "1", "data" : "XXXXX" } ] } }

C#

1  メインクラス 2 public class Main 3 { 4 /// コンストラクタ 5 public Main() 6 { 7 // リクエストのインスタンスを生成する. 8 this.request = new Request 9 { 10 Transaction = new Transaction(), 11 List = new List[]() 12 }; 13 } 14 }

C#

1  Requestクラス 2 public class Request 3 { 4 5 public Transaction Transaction { get; set; } 6 7 public List[] List { get; set; } 8 }

C#

1  Listクラス 2 public class List 3 { 4 public string Group { get; set; } 5 public string Data { get; set; } 6 }

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

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

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

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

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

Zuishin

2020/04/16 07:02

配列を初期化する際には配列の大きさを与えるか、要素の初期値を与える必要があります。 int[] list = new int[]; int[] list = new int[0]; 上は NG で下は OK です。
syosinsya_swift

2020/04/16 07:06

メインクラスで、 List = new List[0]() とやってみたのですが、メソッド名が必要ですエラーになってしまいました。
Zuishin

2020/04/16 07:13

カッコがついてるからじゃないですか?
syosinsya_swift

2020/04/16 07:40

ありがとうございます!!初歩的な誤りでした。 List = new List[0]で指定したのはよかったのですが、Listの数が時によって違うので<リスト型>にしたいです。。重ねて申し訳ありませんが、方法を教えてください。
guest

回答3

0

ベストアンサー

JSON ⇒ C# 変換サービスがあるので使ってみてください。

json2csharp
http://json2csharp.com/

ちなみに質問の JSON 文字列を変換すると以下のようになりました。

public class Transaction { public string id { get; set; } public string server { get; set; } } public class List { public string group { get; set; } public string data { get; set; } } public class Request { public Transaction transaction { get; set; } public List<List> list { get; set; } } public class RootObject { public Request request { get; set; } }

それをベースに Newtonsoft.Json などを使って以下のようにデシリアライズできるはずです。以下の画像で jsonText は質問にあった JSON 文字列です。

イメージ説明

投稿2020/04/16 07:47

編集2020/04/16 07:49
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

syosinsya_swift

2020/04/16 08:05

こちらで解決しました。ありがとうございました。
guest

0

JSONの中の名称が頭が小文字でプロパティは大文字になってます。
JSONありきなら以下のように小文字に、C#ありきなら頭を大文字に揃えましょう

C#

1public class Rootobject 2{ 3 public Request request { get; set; } 4} 5 6public class Request 7{ 8 public Transaction transaction { get; set; } 9 public List<List> list { get; set; } // 後から追加できるように 10} 11 12public class Transaction 13{ 14 public string id { get; set; } 15 public string server { get; set; } 16} 17 18public class List 19{ 20 public string group { get; set; } 21 public string data { get; set; } 22}

C#

1this.request = new Request 2{ 3 Transaction = new Transaction(), 4 List = new List[]() 5}; 67this.request = new Request 8{ 9 transaction = new Transaction(), 10 list = new List<List>() 11};

投稿2020/04/16 07:42

編集2020/04/16 07:44
hihijiji

総合スコア4150

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

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

hihijiji

2020/04/16 08:06

ちなみにJSONからC#のクラスを作るには、JSONをクリップボードにコピーしてから Visual Studio のメニューの [編集]-[形式を選択して貼り付け]-[JSONをクラスとして貼り付ける] で雛形が作成できます。 XMLも同じように作れます。
guest

0

質問内容をちょっと誤解してました。

~~C#でJSON扱うなら、Json.NET(Newtonsoft.Json)みたいなライブラリを使うのが普通です。
~~
~~あと最近の.NET CoreとかならSystem.Text.Jsonとか。(使ってるバージョンによってはnugetで入れないといけないかもしれないけど)
~~
それぞれ使い方をググってみてください。

投稿2020/04/16 07:03

編集2020/04/16 08:48
gentaro

総合スコア8949

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

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

Zuishin

2020/04/16 07:14

その辺のものを何かしら使ってるんじゃないでしょうか。
gentaro

2020/04/16 07:19

ですかね。書いてないことはわかんないです。
Zuishin

2020/04/16 07:22

使ってるかもしれないなら、回答としてどうかと思います。
gentaro

2020/04/16 08:15 編集

その論法はおかしくないですか? 回答として良いか悪いか主観によるものだと思うので別として、ガイドラインにも質問テンプレートにも使ってるフレームワークやライブラリを書きましょう、とあるので、質問者が書いていない事を回答者が推測する前提になるのは客観的に見ておかしいと思いますが。 私としては、そのライブラリの使い方を調べてデシリアライズをするのであれば、そもそも質問文にある「List = new List[]()」という処理が要らないことがわかると思っての回答なんですけどね。
Zuishin

2020/04/16 08:31 編集

シリアライズの際に要ります。
gentaro

2020/04/16 08:41

え? コレクションを含めてデシリアライザがオブジェクト生成するはずなので、コレクションオブジェクトをnewする必要ないと思いましたが、私が何か勘違いしてるんでしょうか? これMainメソッドの中でオブジェクトをデシリアライズするって話ですよね?
gentaro

2020/04/16 08:47 編集

あー、理解しました。シリアライズの話か…。 これは勘違いですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問