facebook twitter hatena line email

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

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(Listもjson対応させる方法)
(公式JsonUtility)
行93: 行93:
 
==公式JsonUtility==
 
==公式JsonUtility==
 
https://docs.unity3d.com/ScriptReference/JsonUtility.html
 
https://docs.unity3d.com/ScriptReference/JsonUtility.html
 +
 +
==他Jsonについて==
 +
Json.NETなどもある
 +
 +
https://yubeshicat.hatenablog.com/entry/2019/11/02/180914

2021年4月30日 (金) 05:24時点における版

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;
    }
}

UserにもSerializableなどがついてる必要がある

User.cs

[Serializable]
public class User
{
    [SerializeField]
    public string name = "";
    [SerializeField]
    public int age = 0;
}


呼び出し

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

公式JsonUtility

https://docs.unity3d.com/ScriptReference/JsonUtility.html

他Jsonについて

Json.NETなどもある

https://yubeshicat.hatenablog.com/entry/2019/11/02/180914