facebook twitter hatena line email

「Unity/Csharp/Json」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(公式JsonUtility)
 
(同じ利用者による、間の1版が非表示)
行1: 行1:
==jsonを扱い方==
+
[[Unity/Csharp/Json/JsonUtility]]
Unity 5.3からJsonUtilityが使えるようになったので、JsonUtilityを使う。
+
  
使いたいpropertyだけ定義すればそれだけを取得することもできる。
+
[[Unity/Csharp/Json/NewtonJson]]
 
+
==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
+
<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>
+
 
+
UserにもSerializableなどがついてる必要がある
+
 
+
User.cs
+
<pre>
+
[Serializable]
+
public class User
+
{
+
    [SerializeField]
+
    public string name = "";
+
    [SerializeField]
+
    public int age = 0;
+
}
+
</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
+
 
+
==JSON parse error: Missingエラーが出るとき==
+
以下エラーが出るとき
+
ArgumentException: JSON parse error: Missing a name for object member.
+
UnityEngine.JsonUtility.FromJson (System.String json, System.Type type) (at /Users/bokken/buildslave/unity/build/Modules/JSONSerialize/Public/JsonUtility.bindings.cs:42)
+
 
+
json内の'を"にしてあげると直った。以下コードで置換した。
+
json = json.Replace("'", "\"");
+
 
+
==公式JsonUtility==
+
https://docs.unity3d.com/ScriptReference/JsonUtility.html
+
 
+
==他Jsonについて==
+
Newtonsoft を使ったJson.NETなどもある
+
 
+
https://yubeshicat.hatenablog.com/entry/2019/11/02/180914
+

2021年7月5日 (月) 15:32時点における最新版

Unity/Csharp/Json/JsonUtility

Unity/Csharp/Json/NewtonJson