2015年10月9日 星期五

【Unity】JSON檔資料讀取

這次要提的是在Unity內做JSON檔讀取的方法,開始之前需要先了解JSON檔是什麼,這裡就不獻醜交給其他人,以下是參考網站:
了解JSON格式

下面大略提一下怎麼寫:
物件用{}包起來,一組資料含鍵值和數值(key:value),鍵值和數值用:隔開,各組資料之間用,隔開,比如說{"name":"Tim",  "age":18}。
陣列使用[],值使用,隔開,如[1, 2, 3]、["Unity", "JSON", "test"]等等。
當然陣列下也可以包含物件,陣列也可以做為物件的數值,例如{"name":"Tim", "age":18, "item_bag":[{"name":"apple", "price":20}, {"name":"sword", "price":300}, "test"]},item_bag下就包含兩個物件和一個字串"test"

大致了解JSON的檔案後,我們需要讓它能在Unity內被存取,這裡使用LitJSON,開啟下列的網站:
http://lbv.github.io/litjson/
Unity JSON

找到dll連結後下載,新增Unity專案將下載完成的LitJson.dll檔匯入,匯入後新增Script(JSONTest.cs),最後把準備好的JSON檔也匯入,這裡用第一段最後的例子(Sample.json)。
Unity JSON

現在Unity專案內會有三個檔案:
1. LitJson.dll
2. JSONTest.cs
3. Sample.json
接著開啟Script,將dll加入參考:
Unity JSON

左側Solution欄位找到此Script名稱,References資料夾右鍵Edit References,找到Assets下的LitJson.dll加入,程式碼中只要using LitJson;沒出錯就代表成功了

到這就可以開始讀取JSON的資料,以下是Script,掛載在Main Camera下:
using UnityEngine;
using System.Collections;
using System.IO;
using LitJson;
public class JSONTest : MonoBehaviour {
        private string jsonString;
        private JsonData jsonData;
        void Start () {
                jsonString = File.ReadAllText (Application.dataPath + "/sample.json");//(1)
                jsonData = JsonMapper.ToObject (jsonString);//(2)
                Debug.Log (jsonData["name"]);//(3)
                Debug.Log (jsonData["age"]);
        }
}
(1)將json檔的內容轉換成字串,File.ReadAllText函式需要using System.IO;,注意一下檔案路徑。
(2)再將字串轉換成物件(Object)後代入JsonData,JsonData需要using LitJson;,到這裡就可以透過查詢JsonData下的鍵值找到數值。
(3)使用鍵值name和age查詢值,依照json檔的內容可以得到Tim和18這兩個log資訊。
Unity JSON

可以看到順利的印出值,接下來看Object第三項item_bag陣列的情況:
using UnityEngine;
using System.Collections;
using System.IO;
using LitJson;
public class JSONTest : MonoBehaviour {
        private string jsonString;
        private JsonData jsonData;
        void Start () {
                jsonString = File.ReadAllText (Application.dataPath + "/sample.json");
                jsonData = JsonMapper.ToObject (jsonString);
                Debug.Log (jsonData["item_bag"][0]["name"] + ":" + jsonData["item_bag"][0]["price"]);
                Debug.Log (jsonData["item_bag"][1]["name"] + ":" + jsonData["item_bag"][1]["price"]);
                Debug.Log (jsonData["item_bag"][2]);
        }
}
當遇到陣列時,就用編號查詢,例如要找item_bag下的第2項名稱,就會是jsonData["item_bag"][2],可以查到test字串,當查到的項目是物件,再接著往下查,如jsonData["item_bag"][0]的項目是{"name":"apple", "price":20},jsonData["item_bag"][0]["name"]可以找到apple字串。
Unity JSON

以上就是讀取的部分,至於存的部分就流到下次再談,以下是參考的教學影片:
https://www.youtube.com/watch?v=OyQQ-7-22Hw

這次就到這裡。

3 則留言:

  1. hi, 第一次接触json,有个问题想请问你; 如何把JSON的数据读取以后贴在ugui的text上?
    因为已经转换成Object (jsonData = JsonMapper.ToObject (jsonString);)那么要如何变成string?

    回覆刪除
    回覆
    1. string json = JsonUtility.ToJson(jsonData);

      刪除

【自製小遊戲】水平思考猜謎(海龜湯)

遊戲連結 海龜湯的玩法是由出題者提出一個難以理解的事件,參與猜題者可以提出任何問題以試圖縮小範圍並找出事件背後真正的原因。但出題者僅能以「是」、「不是」或「沒有關係」來回答問題。 本遊戲蒐集各種論壇、平台的42個題目,提供給想玩海龜湯卻愁找不到題目的你們。 ...