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

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

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

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

JSON

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

3600閲覧

JsonUtilityを使ってネストされたJsonファイルの値を取得したい

YDK

総合スコア63

C#

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

JSON

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/04/19 12:29

編集2021/04/19 12:31

ゲーム制作で音ゲーを作っているのですが、
Json形式で保存されたネストされた譜面の情報を値として取り出したいです。

C#

1public class LoadTest : MonoBehaviour 2{ 3 /// <summary> 譜面が保存されている場所 </summary> 4 string filePath = "NotesData/OVERFLOW"; 5 public string FilePath { get; set; } 6 /// <summary> 楽曲名 </summary> 7 public string Name { get; private set; } 8 /// <summary> レーンの総数 </summary> 9 public int MaxBlock { get; private set; } 10 /// <summary> 1分間に四分音符が何拍なるか </summary> 11 public float BPM { get; private set; } 12 /// <summary> 譜面の開始位置 </summary> 13 public int Offset { get; private set; } 14 /// <summary> </summary> 15 public List<NotesData> Notes { get; private set; } 16 /// <summary> 1拍の内にプレイカーソルが何ライン進むか </summary> 17 public List<int> LPB { get; private set; } = new List<int>(); 18 /// <summary> TODO 今のところ何に使うのか分かっていない </summary> 19 public List<int> Num { get; private set; } = new List<int>(); 20 /// <summary> レーンの番号 </summary> 21 public List<int> Block { get; private set; } = new List<int>(); 22 /// <summary> Notesの種類 </summary> 23 public List<int> Type { get; private set; } = new List<int>(); 24 25 public void LoadNotesData() 26 { 27 string input = Resources.Load<TextAsset>(filePath).ToString(); 28 MusicData music = JsonUtility.FromJson<MusicData>(input); 29 StoreNotesData storeNotes = JsonUtility.FromJson<StoreNotesData>(input); 30 31 Name = music.name; 32 MaxBlock = music.maxBlock; 33 BPM = music.BPM; 34 Offset = music.offset; 35 Notes = storeNotes.datas; 36 foreach (var notesInformation in Notes) 37 { 38 LPB.Add(notesInformation.LPB); 39 Num.Add(notesInformation.num); 40 Block.Add(notesInformation.block); 41 Type.Add(notesInformation.type); 42 foreach (var lowerHierarchy in Notes) 43 { 44 LPB.Add(lowerHierarchy.LPB); 45 Num.Add(lowerHierarchy.num); 46 Block.Add(lowerHierarchy.block); 47 Type.Add(lowerHierarchy.type); 48 } 49 } 50 } 51}

C#

1/// <summary> 楽曲の情報を保持する構造体 </summary> 2[Serializable] 3public struct MusicData 4{ 5 /// <summary> 楽曲のタイトル </summary> 6 public string name; 7 /// <summary> レーンの数 </summary> 8 public int maxBlock; 9 /// <summary> 1分間に四分音符を何拍鳴らすか </summary> 10 public float BPM; 11 /// <summary> 譜面の開始位置 </summary> 12 public int offset; 13} 14 15/// <summary> NotesDataを格納する構造体 </summary> 16[SerializeField] 17public struct StoreNotesData 18{ 19 /// <summary> NotesDataのメンバ変数を保持する </summary> 20 public List<NotesData> datas; 21} 22 23/// <summary> Notesの情報を保持する構造体 </summary> 24[Serializable] 25public struct NotesData 26{ 27 /// <summary> 28 /// 1拍の内にプレイカーソルが何ライン進むか 29 /// (LPB値が大きいほどスクロール速度が上がる) 30 /// </summary> 31 public int LPB; 32 /// <summary> TODO </summary> 33 public int num; 34 /// <summary> レーンの番号 </summary> 35 public int block; 36 /// <summary> Notesの種類 </summary> 37 public int type; 38}

JSON

1{ 2 "name": "OVERFLOW", 3 "maxBlock": 5, 4 "BPM": 120, 5 "offset": 0, 6 "notes": [ 7 { 8 "LPB": 4, 9 "num": 4, 10 "block": 0, 11 "type": 1, 12 "notes": [ 13 ] 14 }, 15 { 16 "LPB": 4, 17 "num": 4, 18 "block": 4, 19 "type": 1, 20 "notes": [ 21 ] 22 }, 23 { 24 "LPB": 4, 25 "num": 8, 26 "block": 0, 27 "type": 1, 28 "notes": [ 29 ] 30 }, 31 { 32 "LPB": 4, 33 "num": 8, 34 "block": 4, 35 "type": 1, 36 "notes": [ 37 ] 38 }, 39 { 40 "LPB": 4, 41 "num": 12, 42 "block": 0, 43 "type": 1, 44 "notes": [ 45 ] 46 }, 47 { 48 "LPB": 4, 49 "num": 12, 50 "block": 4, 51 "type": 1, 52 "notes": [ 53 ] 54 }, 55 { 56 "LPB": 4, 57 "num": 16, 58 "block": 2, 59 "type": 1, 60 "notes": [ 61 ] 62 }, 63 { 64 "LPB": 4, 65 "num": 20, 66 "block": 2, 67 "type": 1, 68 "notes": [ 69 ] 70 }, 71 { 72 "LPB": 4, 73 "num": 24, 74 "block": 0, 75 "type": 2, 76 "notes": [ 77 { 78 "LPB": 4, 79 "num": 28, 80 "block": 0, 81 "type": 2, 82 "notes": [ 83 ] 84 } 85 ] 86 }, 87 { 88 "LPB": 4, 89 "num": 24, 90 "block": 4, 91 "type": 2, 92 "notes": [ 93 { 94 "LPB": 4, 95 "num": 28, 96 "block": 4, 97 "type": 2, 98 "notes": [ 99 ] 100 } 101 ] 102 }, 103 { 104 "LPB": 4, 105 "num": 32, 106 "block": 0, 107 "type": 2, 108 "notes": [ 109 { 110 "LPB": 4, 111 "num": 36, 112 "block": 0, 113 "type": 2, 114 "notes": [ 115 ] 116 }, 117 { 118 "LPB": 4, 119 "num": 40, 120 "block": 1, 121 "type": 2, 122 "notes": [ 123 ] 124 }, 125 { 126 "LPB": 4, 127 "num": 44, 128 "block": 1, 129 "type": 2, 130 "notes": [ 131 ] 132 } 133 ] 134 }, 135 { 136 "LPB": 4, 137 "num": 32, 138 "block": 4, 139 "type": 2, 140 "notes": [ 141 { 142 "LPB": 4, 143 "num": 36, 144 "block": 4, 145 "type": 2, 146 "notes": [ 147 ] 148 }, 149 { 150 "LPB": 4, 151 "num": 40, 152 "block": 3, 153 "type": 2, 154 "notes": [ 155 ] 156 }, 157 { 158 "LPB": 4, 159 "num": 44, 160 "block": 3, 161 "type": 2, 162 "notes": [ 163 ] 164 } 165 ] 166 } 167 ] 168}

###やりたいこと
上記のJSONファイルから値を取り出して使いたい。
###やってみたこと
JSONファイルをでシリアライズしてforeach文で値をListに追加した。
###わからなかったこと
JSONファイルの多重ネストの値の取り出し方

【Unity】音ゲーの譜面エディタ「NoteEditor」紹介
を使って譜面作成をしました。

JSONファイルの多重ネストの値の取り出し方が調べても出てこなかったので質問させて戴きました。
わかる方がいましたら回答お願いします。

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

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

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

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

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

guest

回答2

0

JsonUtilityでは複雑なデシリアライズが出来ないので、
Json.Netを使用するのも1案だと思います。

【参考】
https://spi8823.hatenablog.com/entry/2016/04/16/001641

投稿2021/04/20 08:43

kimkim

総合スコア142

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

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

YDK

2021/04/20 10:29

回答ありがとうございます。 もしJsonUtilityでダメそうでしたらそちらの方法を学んで使おうと思います。
guest

0

ベストアンサー

「ネストされた」とおっしゃるのは、ご提示いただいた譜面の後半にあるような1つのノート(もしかすると用語の使い方がおかしいかもしれませんがご容赦ください...あいにくリズムゲームはなじみがなくてすみませんが、音符は「ノーツ」と複数形で呼ぶのが通例だったりするのでしょうか)の中にさらに複数のノートが入っている構造のことを指しているのでしょうか?

ご紹介いただいたNoteEditorについてコード全体を見たわけではないですが、関係ありそうな部分を探してみましたところ、MusicDTOによるとJSONデータを受け取る型は...

lang

1using System.Collections.Generic; 2 3namespace NoteEditor.DTO 4{ 5 public class MusicDTO 6 { 7 [System.Serializable] 8 public class EditData 9 { 10 public string name; 11 public int maxBlock; 12 public int BPM; 13 public int offset; 14 public List<Note> notes; 15 } 16 17 [System.Serializable] 18 public class Note 19 { 20 public int LPB; 21 public int num; 22 public int block; 23 public int type; 24 public List<Note> notes; 25 } 26 } 27}

となっており、Note型がさらにList<Note>型のフィールドを持っているという構造のようですね。これをまねた形にしてはいかがでしょう。

そして、EditDataSerializer.Deserializeを見ますにtypeが1なら単独の音符として扱い、そうでなければ内部のnotesから子音符を取り出しているようです。
EditDataSerializer.ToDTOによるとtypeは1か2のいずれかの値を取り、1はNoteTypes.Single、2はNoteTypes.Longを表しているようですね。おそらくそれぞれがスクリーンショットに映っている黄緑色の音符と水色の音符を意味するんだろうと思います。

投稿2021/04/19 22:07

編集2021/04/19 22:41
Bongo

総合スコア10807

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

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

YDK

2021/04/20 03:43

回答ありがとうございます。 [System.Serializable] public class EditData { public string name; public int maxBlock; public int BPM; public int offset; public List<Note> notes; } [System.Serializable] public class Note { public int LPB; public int num; public int block; public int type; public List<Note> notes; } 最初は書いていただいた Scriptと似た感じに描いていたのですが、notesのCount数が多重ネストされた部分 だけ取得することができず(値は個々に取得することはできたが、notes変数を2つ定義しているので要素数は多重ネスト以外のネストだけしか取得できないので)先程記述したスクリプトに変更いたしました。 知識がなく申し訳ないのですが、EditDataとNoteクラスをMusicDTOクラスの中に定義するのは何か 意味があるのでしょうか?
YDK

2021/04/20 05:00

こちらを参考に少しやってみたいと思います。ありがとうございました。
Bongo

2021/04/20 10:10

返信が遅れてすみません。当初は回答に引用したものと同様の構造だったとのことですが、それで失敗したとなると謎ですね...JsonUtilityで出力したからにはJsonUtilityで読み込めてしかるべきだと思うのですが(実際NoteEditorではできているようですし)... ご質問者さんの方で少し試してみるとのこと承りました。もし行き詰まってしまうようでしたらそのコードを追記、あるいは一番最初に試して失敗したとおっしゃった時のコードを追記いただければ、もし私の分かる範囲で何か気付いた点があればお返事しようと思います。 どうしてもJsonUtilityではうまくいかないようでしたら、kimkimさんのおっしゃるように別のパーサーを試してみるのも選択肢としてアリだと思います。JsonUtilityはスピード面では優れているようですが、確かに独特の作法というかクセというか...があるのは否めないかもしれません。ご質問者さんにとってしっくりくるものがあれば、それを利用するのもいいでしょう。念のため申し上げますと、もしもともとUnity向けに作られたのではないパーサーを試してみるおつもりでしたら、ご質問者さんがターゲットとしている環境向けにビルドしてもちゃんと動くかどうかは要確認でしょうね。
YDK

2021/04/20 10:37

返信ありがとうございます。 もしダメそうでしたらもう一度返信送りますのでその時はご教授お願いします。 それでもダメそうでしたらKimKimさんに回答して頂いたやり方でやってみたいと思います。
YDK

2021/05/04 07:08

返信遅れて申し訳ありません。 ネストのネストを取得することは無理でしたのでJsonファイルのノートのタイプで判別して 生成しました。この方法だどできたのでこちらでやってみたいと思います。 Bongoさんの説明がわかりやすかったのでベストアンサーにさせて頂きました。 回答してくださった方々もありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問