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

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

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

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

JSON

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

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

Q&A

解決済

1回答

3171閲覧

JSONファイルから情報を取得したい

Yu086

総合スコア5

C#

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

JSON

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

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

0グッド

0クリップ

投稿2020/02/27 14:34

編集2020/02/28 10:34

前提・実現したいこと

現在UnityでAndroid向けの音楽ゲームを制作中です。任意のフォルダ内の譜面ファイル(json形式)をWWWを用いて読み込み、String型の配列に格納する所まではできたのですが、格納したテキストから楽曲情報を取得することができませんでした。情報の取得にはJsonNodeを使用しています。解決策等ありましたらよろしくお願いいたします。

発生している問題・エラーメッセージ

NullReferenceException: Object reference not set to an instance of an object JsonNode.get_Item (System.String key) (at Assets/Plugins/JsonNode/JsonNode.cs:72) MusicData.SetParameter (System.String jsontext, System.Int32 indexNum) (at Assets/Scripts/Scenes/MusicSelect/MusicData.cs:16) MusicSelect.LoadMusicData () (at Assets/Scripts/Scenes/MusicSelect/MusicSelect.cs:34) MusicSelect.Start () (at Assets/Scripts/Scenes/MusicSelect/MusicSelect.cs:24)

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using MiniJSON; 5 6public class MusicData : MonoBehaviour 7{ 8 string title; 9 int bpm; 10 int index; 11 Sprite thumbnail; 12 13 public void SetParameter(string jsontext, int indexNum) 14 { 15 JsonNode json = JsonNode.Parse(jsontext); 16 title = json["name"].Get<string>(); 17 bpm = (int)json["BPM"].Get<long>(); 18 index = indexNum; 19 } 20 21 public string GetTitle() 22 { 23 return title; 24 } 25 26 public int GetBPM() 27 { 28 return bpm; 29 } 30}

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using MiniJSON; 5 6public class JsonManager : MonoBehaviour 7{ 8 static public JsonManager jsonManager; 9 10 static public string[] jsonTexts; 11 12 private void Awake() 13 { 14 if (jsonManager == null) 15 { 16 jsonManager = this; 17 DontDestroyOnLoad(gameObject); 18 } 19 else 20 { 21 Destroy(gameObject); 22 } 23 } 24 25 private void Start() 26 { 27 LoadJson(); 28 } 29 30 void LoadJson() 31 { 32 jsonTexts = new string[GameManager.MusicPath.Length]; 33 34 for (int i = 0; i < jsonTexts.Length; i++) 35 { 36 WWW www = new WWW("file:///" + GameManager.MusicPath[i].Replace("\", "/") + "/Notes.json"); 37 Debug.Log(www.text); 38 jsonTexts[i] = www.text; 39 } 40 } 41}

試したこと

MiniJSONで取得する方法も試してみましたがうまくいきませんでした。

【2020/2/28 追記】
Resources内のjsonファイルの場合はJsonNodeを用いて情報を取得することができます。Resourcesを使う場合とWWWを使う場合で何か異なる処理が必要になるのでしょうか?

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class SampleClass : MonoBehaviour 6{ 7 void Start() 8 { 9 //Resourcesフォルダ内のjsonを読み込む場合 10 LoadSample1(); 11 //WWWクラスで任意のフォルダ内のjsonを読み込む場合 12 LoadSample2(); 13 } 14 15 void LoadSample1() 16 { 17 Debug.Log("Resourcesフォルダ内のjsonを読み込む場合"); 18 19 string jsontext = Resources.Load<TextAsset>("Sample/Notes").ToString(); 20 Debug.Log(jsontext); 21 22 JsonNode json = JsonNode.Parse(jsontext); 23 Debug.Log(json); 24 25 string title = json["name"].Get<string>(); 26 Debug.Log("タイトル:" + title); 27 int bpm = (int)json["BPM"].Get<long>(); 28 Debug.Log("BPM:" + bpm); 29 } 30 31 void LoadSample2() 32 { 33 Debug.Log("WWWクラスで任意のフォルダ内のjsonを読み込む場合"); 34 35 WWW www = new WWW("file:///" + GameManager.MusicPath[0].Replace("\", "/") + "/Notes.json"); 36 string jsontext = www.text; 37 Debug.Log(jsontext); 38 39 JsonNode json = JsonNode.Parse(jsontext); 40 Debug.Log(json); 41 42 string title = json["name"].Get<string>(); 43 Debug.Log("タイトル:" + title); 44 int bpm = (int)json["BPM"].Get<long>(); 45 Debug.Log("BPM:" + bpm); 46 } 47}

実行画面

補足情報(FW/ツールのバージョンなど)

Unity 2019.2.18f1

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラー内容は存在しないオブジェクト、となっているので、
JsonNode jsonに値が入っているか、"name"というキーが存在しているか、print等で確認してみてください。

投稿2020/02/27 15:33

yuuyu

総合スコア1139

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

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

Yu086

2020/02/28 10:42

回答ありがとうございます。Debug.Logで出力し確認してみましたが、jsonに値は入っているのではないかと思います。Resourcesフォルダから読み込む場合は同様の処理で正常に動作するので、jsontextへ文字列を代入する部分で何か問題があるのではないかと考えています。
yuuyu

2020/02/28 11:50

ログで見た感じで何も差がないのであれば、前後に空白が入っているかもしれないので、一度確認してもらえますか? string jsontext = www.text; →string jsontext = www.text.Trim();
Yu086

2020/02/28 13:04

該当部分を提示して頂いたプログラムに差し替えて実行してみましたがやはり同様のエラーが表示されました。
yuuyu

2020/02/28 15:49 編集

そちらで使用していると思われるJsonNodeを入れて、試してみていたのですが、 おそらく先頭に何かしらの文字が含まれているとNullReferenceExceptionが返されるのではないかと思われます。 なので、空白ではなく、全ての文字を消し去る方で一度試してもらえませんか? using System.Text.RegularExpressions; の追記と、 jsontext = Regex.Replace(jsontext, @"^[^{]*", ""); をstring jsontext = www.text;の後ろに追記
Yu086

2020/02/28 16:23

提示して頂いた方法を試してみたところ正常に情報を取得することができました。本当に助かりました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問