「Unity/Csharp/Json」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→jsonからオブジェクトへ) |
(→Listもjson対応させる方法) |
||
行46: | 行46: | ||
==Listもjson対応させる方法== | ==Listもjson対応させる方法== | ||
− | + | 通常Listは[Serializable]が記述されていないため、json化できないが、リンク先のクラスを噛ませればできる。 | |
+ | |||
+ | Serialization.cs | ||
+ | <pre> | ||
+ | using UnityEngine; | ||
+ | using System.Collections; | ||
+ | using System.Collections.Generic; | ||
+ | using System; | ||
+ | [Serializable] | ||
+ | public class Serialization<T> | ||
+ | { | ||
+ | [SerializeField] | ||
+ | List<T> target; | ||
+ | public List<T> ToList() { return target; } | ||
+ | |||
+ | public Serialization(List<T> target) | ||
+ | { | ||
+ | this.target = target; | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | 呼び出し | ||
+ | <pre> | ||
+ | string json = JsonUtility.ToJson(new Serialization<User>(users)); // 出力例 : {"target":[{"name":"taro","age":19}]} | ||
+ | List<Enemy> users = JsonUtility.FromJson<Serialization<User>>(json).ToList(); | ||
+ | </pre> | ||
+ | |||
+ | 参考:http://kou-yeung.hatenablog.com/entry/2015/12/31/014611 | ||
==公式JsonUtility== | ==公式JsonUtility== | ||
https://docs.unity3d.com/ScriptReference/JsonUtility.html | https://docs.unity3d.com/ScriptReference/JsonUtility.html |
2019年2月28日 (木) 05:45時点における版
jsonを扱い方
Unity 5.3からJsonUtilityが使えるようになったので、JsonUtilityを使う。
使いたいpropertyだけ定義すればそれだけを取得することもできる。
json展開
json
{"status":"ok","notice":"message1","user":{"id":1,"name":"taro","likes":["tyoko","prin"]}}
サンプル
using System; public class AuthScript : MonoBehaviour { [Serializable] class ResData { public string status = "ok"; public string notice = ""; public ResUser user; } [Serializable] class ResUser { public int id = 0; public string name = ""; public string[] likes; } void ExecJsonParse (string json) { ResData resData = JsonUtility.FromJson<ResData>(json); Debug.Log("status=" + resData.status); Debug.Log("notice=" + resData.notice); Debug.Log("user.name=" + resData.user.name); foreach (string like in resData.user.likes) { Debug.Log("like=" + like); } } }
以下エラーとなる場合は[Serializable]が足りない場合がある
NullReferenceException: Object reference not set to an instance of an object
[Serializable]を追加して以下エラーとなる場合はusing System;が足らない可能性がある。
error CS0246: The type or namespace name `Serializable' could not be found. Are you missing an assembly reference?
jsonからオブジェクトへ
User user = new User(); string json = JsonUtility.ToJson(user);
Listもjson対応させる方法
通常Listは[Serializable]が記述されていないため、json化できないが、リンク先のクラスを噛ませればできる。
Serialization.cs
using UnityEngine; using System.Collections; using System.Collections.Generic; using System; [Serializable] public class Serialization<T> { [SerializeField] List<T> target; public List<T> ToList() { return target; } public Serialization(List<T> target) { this.target = target; } }
呼び出し
string json = JsonUtility.ToJson(new Serialization<User>(users)); // 出力例 : {"target":[{"name":"taro","age":19}]} List<Enemy> users = JsonUtility.FromJson<Serialization<User>>(json).ToList();
参考:http://kou-yeung.hatenablog.com/entry/2015/12/31/014611