🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

JSON

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

Unity

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

Q&A

解決済

1回答

5332閲覧

【Unity C#】null許容値型変数に JsonUtilityでJSONから値を読み込めない

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

JSON

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

Unity

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

0グッド

0クリップ

投稿2021/03/11 13:54

編集2021/03/12 01:51

実現したいこと

お世話になっております.

UnityのC#でJsonUtilityを使用して,null許容値型の変数にJSON形式のデータから値を読み込みたいです.

発生している問題・試した事

以下の様な,xz座標値を格納する為のクラス(Coordinateクラスに属するPosition14はそれぞれx,y,z座標を複数組持つ)を定義し,空のインスタンスを作成してから,JsonUtility.FromJsonOverwrite により値を上書きしようとしています.

  1. この座標値は null にもなり得る予定なので,型はnull許容値型 double? としました.

値が正しく代入されたか確認する為にUnityのコンソールに全てのxの値を出力した所,何も出力されませんでした.全てがNull値となってしまいました.
追記:また,JSONファイル側のnullを適当な数値に書き換えてnullを含まないJSONファイルを読み込んでも,全てNullとして読み込まれました.

  1. 試しに,メンバ変数x,y,zの型を通常の double としてみると,JSONで null となっている部分は0に変換されて読み込まれ,それ以外の数値は正常に読み込まれました.

以上の事から,恐らくJsonUtilityとnull許容値型との相性が悪いのではないかと思われます.

1.double?型 とした時2.double型 とした時
全てnullとなる.また,JSONファイルでnull値になっている部分を通常の数値に書き換えても全ても同じ.JSONで null の部分は0に変換され,それ以外の数値は正常に読み込まれる.
イメージ説明イメージ説明

該当のソースコード

c#

1//Test.cs 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using System.IO; 6 7namespace hoge{ 8 9 [System.Serializable] public class Coordinate //Position1~4について,複数組のx,y,z座標値を格納したい 10 { 11 public Position1[] pos1; 12 public Position2[] pos2; 13 public Position3[] pos3; 14 public Position4[] pos4; 15 } 16 [System.Serializable] public class Position1 17 { //null許容値型にすると値が一切読み込まれない 18 //通常のdouble型にするとJSONで数値になっている部分は正常に読み込まれ,nullになっている所は0として読み込まれる 19 public double? x; 20 public double? y; 21 public double? z; 22 } 23 [System.Serializable] public class Position2:Position1{} 24 [System.Serializable] public class Position3:Position1{} 25 [System.Serializable] public class Position4:Position1{} 26 27 public class Test : MonoBehaviour 28 { 29 void Start() 30 { 31 string data = File.ReadAllText("D:/hogehoge/test.json"); 32 Coordinate coordinate = new Coordinate(); 33 JsonUtility.FromJsonOverwrite(data, coordinate); 34 35 //確認の為出力すると,上手く行かない 36 foreach(var item in coordinate.pos1) 37 { 38 Debug.Log(item.x); 39 } 40 foreach(var item in coordinate.pos2) 41 { 42 Debug.Log(item.x); 43 } 44 foreach(var item in coordinate.pos3) 45 { 46 Debug.Log(item.x); 47 } 48 foreach(var item in coordinate.pos4) 49 { 50 Debug.Log(item.x); 51 } 52 void Update() 53 { 54 } 55 } 56}

json

1{ 2 "pos1": [ 3 { 4 "x": null, 5 "y": null, 6 "z": null 7 }, 8 { 9 "x": -15523.5600045, 10 "y": 555, 11 "z": 6.66 12 }, 13 { 14 "x": 123, 15 "y": 555, 16 "z": 666 17 }, 18 { 19 "x": 123, 20 "y": 555, 21 "z": 666 22 } 23 ], 24 "pos2": [ 25 { 26 "x": 123, 27 "y": 555, 28 "z": 666 29 }, 30 { 31 "x": 1923, 32 "y": 555, 33 "z": 666 34 } 35 ], 36 "pos3": [ 37 { 38 "x": 123, 39 "y": 555, 40 "z": 666 41 } 42 ], 43 "pos4": [ 44 { 45 "x": 123, 46 "y": 555, 47 "z": 666 48 }, 49 { 50 "x": 1923, 51 "y": 555, 52 "z": 666 53 }, 54 { 55 "x": null, 56 "y": null, 57 "z": null 58 } 59 ] 60}

補足情報

環境は以下の通りです.

  • Windows10 64it
  • Unity 2020.2.7f1

また,UnityのProject Settings>Playerの一部項目の設定についてです.UnityもC#も全くの入門者なのでまだあまり良く理解出来ておりませんが,この部分の設定がC#で扱える機能に関わると聞いたので,ご参考になればと載せておきます.(ひょっとすると不要な情報かもしれませんが…)
イメージ説明

宜しくお願い致します.

追記

調べて見ると,「UnityのJsonUtililyがnull許容値を扱えない」という問題はあったみたいです.
そもそも今回JSONでデータを読み込もうとする目的は,pythonプログラムで取得した座標をUnityへ送信したく,その際言語間のデータ渡しには一旦データをシリアル化する必要があるとの事でJSON形式を採用しました.リアルタイムなので処理は極力高速なものが良いだろうと思い,JsonUtilityを使おうとしている,という経緯でしたが…
今後はnull許容型を使わない方法か,JsonUtililyあるいはJSON形式を使わない方法を検討してみる事にします.

Unity5.3でJsonを扱うまとめ - Qiit

null許容型は値が定義されていようが全てnullになってしまうみたいです

JSON Utility creates empty classes instead of null

null serialized classes will get filled out with default values when you deserialize them.

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

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

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

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

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

sakura_hana

2021/03/12 00:14

nullと文字列を結合すると空白扱いになるので、Debug.Log(item.x);としてみてください。
退会済みユーザー

退会済みユーザー

2021/03/12 01:27

お返事ありがとうございます.修正致しました.nullと文字列連結についての仕様を把握出来ておりませんでした…;; 今の所試している感じだと,どうやらnullable型とJsonUtilityの相性がそもそも良くなかったみたいでした.
guest

回答1

0

ベストアンサー

UnityEngine.JsonUtilityでそもそもnullable型を扱えない様だったので,一旦値を文字列として読み込んでからdouble.TryParse()で数値に変換してやる事で対処出来そうです.

C#

1 [System.Serializable] public class Coordinate 2 { 3 public Position[] pos1; //※ついでに修正.わざわざPositionクラスを4つ作る必要が無かった 4 public Position[] pos2; 5 public Position[] pos3; 6 public Position[] pos4; 7 } 8 [System.Serializable] public class Position 9 { 10 public string x;//ここ 11 public string y; 12 public string z;

C#

1foreach(var item in coordinate.pos1) 2{ double i; 3 if(double.TryParse(item.x,out i)) 4 { 5 Debug.Log(i); 6 } 7 else 8 { 9 Debug.Log("Null"); 10 } 11}

イメージ説明

投稿2021/03/12 01:44

編集2021/03/12 03:40
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問