(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!


UnityのJsonUtilityでJSONの変換失敗を検知する方法【Unity】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 6000.0.42f1


はじめに

UnityにはJsonUtilityというJSONデータを手軽に扱えるクラスがあります。



そんなJsonUtilityはJSONの形式がおかしいと以下のようにエラーを出します。

ArgumentException: JSON parse error: Missing a name for object member.

//Jsonから変換する用のサンプルクラス
[System.Serializable]
public class SampleData {
  public int number;
  public string text;
}
//不正な形式なJSON文字列をJsonUtilityで変換
string jsonString = "{ \"number\": 123, \"text\": \"Hello\", \"extra\": true, }";
SampleData data = JsonUtility.FromJson<SampleData>(jsonString);


今回はこういったJsonUtilityの変換失敗を検知してエラーが出ないようにする方法の紹介です!


UnityのJsonUtilityでJSONの変換失敗を検知する方法

JsonUtilityは手軽に扱える反面、機能が少なく、変換失敗を検知する機能はありません。

なので、変換の失敗にはtry-catchを使う必要があります。

// テスト用のJSON文字列(あえて不正な部分を含む)
string jsonString = "{ \"number\": 123, \"text\": \"Hello\", \"extra\": true, }";
        
//try-catchで変換失敗のエラーを
try {
  SampleData data = JsonUtility.FromJson<SampleData>(jsonString);
      
  if (data == null) {
    Debug.Log("JsonUtility: 変換結果がnullでした。");
  }
  else {
    Debug.Log($"JsonUtility: number={data.number}, text={data.text}");
  }
}
catch (System.Exception e) {
  //try内で例外発生(JSONの変換失敗)検知
  Debug.Log($"JsonUtility: 例外が発生 -> {e.Message}");
}


なお、空文字やnullのstringを変換しようとするとエラーは出ず、変換されたオブジェクトがnullになる

という点にも注意が必要です。


なお、JsonUtilityでなく他のライブラリを使うという手段もあります。

例えば、C#でJSONを扱う有名なライブラリJson.NET(Newtonsoft.Json)

Unity向けに公式にパッケージもありますし、多機能でエラーハンドリングも充実しています。

実際にJson.NETを試した所、多機能ではあるんですが、

変換失敗の検知にtry-catchが必要な点はJsonUtilityと同じでした。