1. HOME
  2. ブログ
  3. Unity
  4. UnityでJsonデータをPostする

技術ブログ

Blog

Unity

UnityでJsonデータをPostする

今回はUnityからJsonデータを、APIサーバーへ送信する処理を備忘録として記しておきます。
※APIサーバーのソースは割愛します

名前空間の宣言

using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.Networking;

----------------
using System.Text;
//Jsonデータをエンコードする際に必要

using System.IO;
//ファイルを読み書きする際に必要(今回は使用しないがJsonファイルを読み出したりする時に宣言する)

using System.Linq;
//Toggleで選択されている値を取得する際に必要

using UnityEngine.UI;
//UnityのUIをスクリプトで扱う際に必要

using UnityEngine.EventSystems;
//ユーザーからの入力やボタン操作をスクリプトで処理する際に必要

using UnityEngine.Networking;
//ネットワーク処理をする際に必要(リクエスト・レスポンス処理など)

JsonUtilityで構造体をシリアライズ

Unity5系に標準搭載のライブラリ「JsonUtility」を使用して構造体をJson形式にシリアライズします。この構造体に宣言されていないデータはJsonでのやり取りができません。

[System.Serializable]
    public class AccountRegistrationJson {
        public string sex;
        public string dropdown_yt;
        public string dropdown_mt;
        public string dropdown_dt;
        public string mailaddress;
        public string password1;
        public string password2;
        public string userid;
    }

構造体を初期化する

public AccountRegistrationJson AccountRegistrationData = new AccountRegistrationJson();

使用するUI要素をインスペクターから指定できるように宣言

   [SerializeField] ToggleGroup Sex;
    [SerializeField] Dropdown DropdownY;
    [SerializeField] Dropdown DropdownM;
    [SerializeField] Dropdown DropdownD;
    [SerializeField] InputField MailAddress;
    [SerializeField] InputField Password1;
    [SerializeField] InputField Password2;
    [SerializeField] InputField UserID;

一番最初に実行される関数でUIオブジェクトを取得する

public void Start()
    {
        Sex = GameObject.Find("Toggle").GetComponent<ToggleGroup>();
        DropdownY = GameObject.Find("Dropdown1").GetComponent<Dropdown>();
        DropdownM = GameObject.Find("Dropdown2").GetComponent<Dropdown>();
        DropdownD = GameObject.Find("Dropdown3").GetComponent<Dropdown>();
        MailAddress = GameObject.Find("Input_Mail").GetComponent<InputField>();
        Password1 = GameObject.Find("Input_Password1").GetComponent<InputField>();
        Password2 = GameObject.Find("Input_Password2").GetComponent<InputField>();
        UserID = GameObject.Find("Input_UserID").GetComponent<InputField>();
    }

ボタンクリック時の関数「onClick」を作成し、値を先ほど宣言した構造体内の変数に格納する。次に、格納した変数をJson形式へシリアライズする。
最後に、後述するIEnumeratorインターフェースで記述したメソッドをコールするコルーチンを記述する。

public void OnClick() {
        AccountRegistrationData.sex = Sex.ActiveToggles().FirstOrDefault().GetComponentsInChildren<Text>().First(t => t.name == "Label").text;
        AccountRegistrationData.dropdown_yt = DropdownY.options[dropdown_y].text;
        AccountRegistrationData.dropdown_mt = DropdownM.options[dropdown_m].text;
        AccountRegistrationData.dropdown_dt = DropdownD.options[dropdown_d].text;
        AccountRegistrationData.mailaddress = MailAddress.text;
        AccountRegistrationData.password1 = Password1.text;
        AccountRegistrationData.password2 = Password2.text;
        AccountRegistrationData.userid = UserID.text;
        Toggle tgl = Sex.ActiveToggles().FirstOrDefault();
        string jsonstr = JsonUtility.ToJson (AccountRegistrationData);
        Debug.Log (jsonstr);

        StartCoroutine(Post("http:〜〜", jsonstr));
    }

Post時の反復処理を記述する

IEnumerator Post(string url, string jsonstr)
    {
        var request = new UnityWebRequest(url, "POST");
        byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonstr);
        request.uploadHandler = (UploadHandler) new UploadHandlerRaw(bodyRaw);
        request.downloadHandler = (DownloadHandler) new DownloadHandlerBuffer();
        request.SetRequestHeader("Content-Type", "application/json");

        yield return request.Send();

        Debug.Log("Status Code: " + request.responseCode);
    }

全体のコード

using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.Networking;


public class AccountRegistration : MonoBehaviour
{
    [SerializeField] ToggleGroup Sex;
    [SerializeField] Dropdown DropdownY;
    [SerializeField] Dropdown DropdownM;
    [SerializeField] Dropdown DropdownD;
    [SerializeField] InputField MailAddress;
    [SerializeField] InputField Password1;
    [SerializeField] InputField Password2;
    [SerializeField] InputField UserID;

    int dropdown_y;
    int dropdown_m;
    int dropdown_d;

    [System.Serializable]
    public class AccountRegistrationJson {
        public string sex;
        public string dropdown_yt;
        public string dropdown_mt;
        public string dropdown_dt;
        public string mailaddress;
        public string password1;
        public string password2;
        public string userid;
    }

    public AccountRegistrationJson AccountRegistrationData = new AccountRegistrationJson();

    public void Start()
    {
        Sex = GameObject.Find("Toggle").GetComponent<ToggleGroup>();
        DropdownY = GameObject.Find("Dropdown1").GetComponent<Dropdown>();
        DropdownM = GameObject.Find("Dropdown2").GetComponent<Dropdown>();
        DropdownD = GameObject.Find("Dropdown3").GetComponent<Dropdown>();
        MailAddress = GameObject.Find("Input_Mail").GetComponent<InputField>();
        Password1 = GameObject.Find("Input_Password1").GetComponent<InputField>();
        Password2 = GameObject.Find("Input_Password2").GetComponent<InputField>();
        UserID = GameObject.Find("Input_UserID").GetComponent<InputField>();
    }

    public void OnClick() {
        AccountRegistrationData.sex = Sex.ActiveToggles().FirstOrDefault().GetComponentsInChildren<Text>().First(t => t.name == "Label").text;
        AccountRegistrationData.dropdown_yt = DropdownY.options[dropdown_y].text;
        AccountRegistrationData.dropdown_mt = DropdownM.options[dropdown_m].text;
        AccountRegistrationData.dropdown_dt = DropdownD.options[dropdown_d].text;
        AccountRegistrationData.mailaddress = MailAddress.text;
        AccountRegistrationData.password1 = Password1.text;
        AccountRegistrationData.password2 = Password2.text;
        AccountRegistrationData.userid = UserID.text;
        Toggle tgl = Sex.ActiveToggles().FirstOrDefault();
        string jsonstr = JsonUtility.ToJson (AccountRegistrationData);
        Debug.Log (jsonstr);

        StartCoroutine(Post("http:〜〜", jsonstr));
    }

    IEnumerator Post(string url, string jsonstr)
    {
        var request = new UnityWebRequest(url, "POST");
        byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonstr);
        request.uploadHandler = (UploadHandler) new UploadHandlerRaw(bodyRaw);
        request.downloadHandler = (DownloadHandler) new DownloadHandlerBuffer();
        request.SetRequestHeader("Content-Type", "application/json");

        yield return request.Send();

        Debug.Log("Status Code: " + request.responseCode);
    }

}

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

関連記事