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

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

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

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

JSON

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

2回答

552閲覧

Unity jsonファイルの特定の配列の有無を判断する方法について

Zvxp

総合スコア1

C#

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

JSON

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2022/08/14 10:35

"note":[{"beat":[24,0,4],"block":1},
{"beat":[103,0,2],"endbeat":[104,0,2],"block":3},{"beat":[205,0,4],"block":4},...]

という不規則にendbeatと書かれた配列が出現するjsonファイルについて質問があります。連続して読み込まれる{"beat":[0,0,0],"block":0}にendbeatが含まれているのかを判断する方法はありますでしょうか?
if文で判断できるような形にしたいです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/08/14 11:38

JSON に見えませんけど
Zvxp

2022/08/14 11:44

jsonというのは間違いないはずです。
退会済みユーザー

退会済みユーザー

2022/08/15 01:02 編集

質問者さん、無言ですが、回答が出ているのでそれらに対するフィードバックを返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。 http://www.json.org/json-ja.html を見てもらっても分からなかったようですが、それに書いてある「オブジェクトは、{(左の中括弧)で始まり、} (右の中括弧)で終わります」が質問文に提示された文字列に無いのが分かりますか?
Zvxp

2022/08/15 03:23

{"note":[{"beat":[24,0,4],"block":1}, {"beat":[103,0,2],"endbeat":[104,0,2],"block":3},{"beat":[205,0,4],"block":4}} 正確にはこうでしたすいません書き忘れてました。
退会済みユーザー

退会済みユーザー

2022/08/15 06:07

後の方の ] が落ちています。以下のようにしないと正しい JSON 文字列になりません。 {"note":[{"beat":[24,0,4],"block":1}, {"beat":[103,0,2],"endbeat":[104,0,2],"block":3},{"beat":[205,0,4],"block":4}]} 上記をベースに C# のクラス定義を作成し、そのオブジェクトにデシリアライズする方法を回答欄に追記しておきます。
guest

回答2

0

正しくクラス定義してその型でデシリアライズすれば、System.Text.Jsonではendbeatはnullになります。
ただ、どのようにデシリアライズしているのか記載していないので貴方の実装で実際読み込んで確認してみましょう。

投稿2022/08/14 23:38

YAmaGNZ

総合スコア10258

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

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

0

ベストアンサー

質問のコメントで言った JSON として正しいかはちょっと置いといて・・・

endbeatが含まれているのかを判断する方法はありますでしょうか?

String.Contains メソッドを使ってはいかがですか? 具体的には以下の記事を見てください。

文字列に特定の文字列が含まれているかを調べるには?(Contains編)
https://atmarkit.itmedia.co.jp/ait/spv/0602/17/news119.html

他に、上の記事にも書いてありますが、IndexOf メソッドを使うという手もあります。

それなら文字列が JSON として正しいか否かに関わらずチェックできます。

上記ではダメで、デシリアライズしてから調べるとかの話であれば、JSON として正しい文字列のサンプルを書いてください。


【追記】

上の質問のコメント欄の 2022/08/15 15:07 の私のコメントで、

{"note":[{"beat":[24,0,4],"block":1},
{"beat":[103,0,2],"endbeat":[104,0,2],"block":3},{"beat":[205,0,4],"block":4}]}

上記をベースに C# のクラス定義を作成し、そのオブジェクトにデシリアライズする方法を回答欄に追記しておきます。

・・・と書いた件です。.NET Framework 4.8 のコンソールアプリを使って例を書きます。

まず、上の JSON 文字列をベースに、C# のオブジェクトのクラス定義を作成します。それには以下の記事に書いたように Visual Studio を利用できます。

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

上の記事に書いてあるようにして JSON 文字列から C# のクラス定義を作成すると以下の通りとなります。

public class Rootobject { public Note[] note { get; set; } } public class Note { public int[] beat { get; set; } public int block { get; set; } public int[] endbeat { get; set; } }

.NET Framework での定番の Newtonsoft.Json と System.Text.Json を使って、上の JSON 文字列を Rootobject クラスのオブジェクトにデシリアライズしてみます。

using Newtonsoft.Json; using System; namespace ConsoleAppJson { internal class Program { static void Main(string[] args) { var jsonString = @"{""note"":[ {""beat"":[24,0,4],""block"":1}, { ""beat"":[103,0,2],""endbeat"":[104,0,2],""block"":3}, { ""beat"":[205,0,4],""block"":4} ]}"; // Newtonsoft.Json var result1 = JsonConvert.DeserializeObject<Rootobject>(jsonString); // System.Text.Json var result2 = System.Text.Json.JsonSerializer.Deserialize<Rootobject>(jsonString); Console.Read(); } } }

結果は以下のようになります。デバッガで途中で実行を止めて Newtonsoft.Json でのデシリアライズ結果 result1 の結果を見たものです。System.Text.Json のデシリアライズ結果 result2 も同じになります。JSON 文字列に "endbeat" が存在する場合はその内容が、存在しない場合は null になっているとことに注目してください。

イメージ説明

Unity でよく使われているという JsonUtility でも同じ結果になると思います。

投稿2022/08/14 23:07

編集2022/08/15 06:30
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Zvxp

2022/08/15 07:37

ありがとうございます。無事できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問