はじめに
UnityでJSON形式のデータをパースする方法について簡単にまとめました。
環境
Unity : 2017.4.40f1
OS : Windows 10 Home 2004
概要
UnityでJSON形式のデータをパースするには、主に2種類の方法があります。
それは、
- MiniJSONを使う方法
- JsonUtilityを使う方法
の2種類です。
使い分けとしては、MiniJSONはGETリクエスト用、JsonUtilityはそれ以外(自分で用意したJSON形式のデータなど)用でいいと思います。
なぜかというと、MiniJSONとJsonUtilityには大きな違いが一つあるからです。
MiniJSONは、JSON形式の構造を事前に宣言する必要がなく、JsonUtilityは事前に宣言する必要があります。
JSON形式の構造が複雑な場合それを手打ちで書き起こすのは面倒であり、おそらく多くの場合GETリクエストで取得したJSON形式のデータのうち使いたいものは一部分でしょう。
よって、GETリクエストで取得したJSON形式のデータをパースするにはMiniJSONが適しているといえるでしょう。
もちろん、取得したJSON形式のデータが複雑でない場合は、事前にJSON形式の構造を宣言してJsonUtilityを使ってもいいでしょう。
コード
Unityプロジェクトはこちらからダウンロードできます。
https://github.com/GuiltyWorks/GetRequestWithJSON
それでは、実際のコードと実行結果を見ていきましょう。
※MiniJSON.csをアセットに入れておきましょう。
※今回はlivedoorの天気情報APIを叩いています。適宜URLを変えてください。
【2021年7月追記】
※livedoorの天気情報APIは2020年7月にサービスが終了しました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using MiniJSON;
public class GetRequestWithJSON : MonoBehaviour
{
public string uri = "http://weather.livedoor.com/forecast/webservice/json/v1?city=130010";
void Start()
{
StartCoroutine(GetRequest(this.uri));
}
private IEnumerator GetRequest(string uri)
{
Debug.Log("-------- GET Request Start --------");
using (UnityWebRequest request = UnityWebRequest.Get(uri))
{
yield return request.SendWebRequest();
if (request.isNetworkError || request.isHttpError)
{
Debug.Log("GET Request Failure");
Debug.Log(request.error);
}
else
{
Debug.Log("GET Request Success");
Debug.Log(request.downloadHandler.text);
Dictionary<string, object> response = Json.Deserialize(request.downloadHandler.text) as Dictionary<string, object>;
Debug.Log(response["title"]);
}
}
}
}
エラーがある場合はエラーを表示し、エラーがない場合はGETリクエストで取得したJSON形式のデータを表示します。
実行結果
参考文献
公式ドキュメント : UnityWebRequest.Get
JsonUtility をつかって Unity で JSON を取り扱う方法
MiniJSON