実現したいこと
お世話になっております.
UnityのC#でJsonUtilityを使用して,null許容値型の変数にJSON形式のデータから値を読み込みたいです.
発生している問題・試した事
以下の様な,xz座標値を格納する為のクラス(Coordinateクラスに属するPosition14はそれぞれx,y,z座標を複数組持つ)を定義し,空のインスタンスを作成してから,JsonUtility.FromJsonOverwrite により値を上書きしようとしています.
- この座標値は null にもなり得る予定なので,型はnull許容値型 double? としました.
値が正しく代入されたか確認する為にUnityのコンソールに全てのxの値を出力した所,何も出力されませんでした.全てがNull値となってしまいました.
追記:また,JSONファイル側のnullを適当な数値に書き換えてnullを含まないJSONファイルを読み込んでも,全てNullとして読み込まれました.
- 試しに,メンバ変数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形式を使わない方法を検討してみる事にします.
null許容型は値が定義されていようが全てnullになってしまうみたいです
JSON Utility creates empty classes instead of null
null serialized classes will get filled out with default values when you deserialize them.
回答1件
あなたの回答
tips
プレビュー