那實在是整死人,因為那時的資料架構很多是沒有固定的,也就是裡面的欄位會任意增減,所以我都用原始的方式去一一檢驗裡面的架構再取得資料。
現在就輕鬆多了,資料架構都是事先固定的,故可用JSONObject一次性搞定,這邊就來記錄一下。
這邊使用的是LitJson,其他的Json也有一樣的做法。
首先是準備資料,我準備了一個JSON字串如下:
[{"name":"這是一號清單","listID":1,"listData":[{"id":1,"content":"一號內容1"},{"id":2,"content":"一號內容2"},{"id":3,"content":"一號內容3"}]},{"name":"這是二號清單","listID":2,"listData":[{"id":1,"content":"二號內容1"},{"id":2,"content":"二號內容2"},{"id":3,"content":"二號內容3"},{"id":4,"content":"二號內容4"},{"id":5,"content":"二號內容5"}]}]
使用網路上的JSON Reader可看到排版後的資料內容:
這是一個兩層Array的架構,可以有數份清單,每份清單內有數個被編號的內容。
接著當要在程式內把這字串寫出來時,需要變換符號,主要是『"』這符號必須要變更,變更方式等在網路上都找得到,這裡就不贅述。
[{\"name\":\"這是一號清單\", \"listID\":1, \"listData\":[{\"id\":1, \"content\":\"一號內容1\"},{\"id\":2,\"content\":\"一號內容2\"},{\"id\":3,\"content\":\"一號內容3\"}]},{\"name\":\"這是二號清單\",\"listID\":2,\"listData\":[{\"id\":1,\"content\":\"二號內容1\"},{\"id\":2,\"content\":\"二號內容2\"},{\"id\":3,\"content\":\"二號內容3\"},{\"id\":4,\"content\":\"二號內容4\"},{\"id\":5,\"content\":\"二號內容5\"}]}]
然後就來正式寫程式吧:
using System.Collections; using System.Collections.Generic; using UnityEngine; using LitJson; public class DataController : MonoBehaviour { public class DataClass { public string name; public int listID; public ListDataClass[] listData; } public class ListDataClass { public int id; public string content; } private string jsonContent = "[{\"name\":\"這是一號清單\", \"listID\":1, \"listData\":[{\"id\":1, \"content\":\"一號內容1\"},{\"id\":2,\"content\":\"一號內容2\"},{\"id\":3,\"content\":\"一號內容3\"}]},{\"name\":\"這是二號清單\",\"listID\":2,\"listData\":[{\"id\":1,\"content\":\"二號內容1\"},{\"id\":2,\"content\":\"二號內容2\"},{\"id\":3,\"content\":\"二號內容3\"},{\"id\":4,\"content\":\"二號內容4\"},{\"id\":5,\"content\":\"二號內容5\"}]}]"; private JsonData jsonData; private ListdataClassList = new List (); private DataClass dataClass = new DataClass(); void Start() { jsonData = JsonMapper.ToObject(jsonContent); Debug.Log("這是直接版的【Name】:" + jsonData[0]["name"]); Debug.Log("這是直接版的【一號清單內的第3項之Content】:" + jsonData[0]["listData"][2]["content"]); Debug.Log("------------------------------------------------------------------"); dataClassList = JsonMapper.ToObject >(jsonContent); for (int i = 0; i < dataClassList.Count; i++) { dataClass = dataClassList[i]; //Debug.Log("【" + i + "=Name" + "】:" + dataClass.name); //Debug.Log("【" + i + "=List ID" + "】:" + dataClass.listID); Debug.Log(i); Debug.Log(" name:" + dataClass.name); Debug.Log(" listID:" + dataClass.listID); Debug.Log(" listData"); for (int j = 0; j < dataClass.listData.Length; j++) { //Debug.Log("【" + i + "-" + j + "=ID" + "】:" + dataClass.listData[j].id); //Debug.Log("【" + i + "-" + j + "=Content" + "】:" + dataClass.listData[j].content); Debug.Log(" " + j); Debug.Log(" id:" + dataClass.listData[j].id); Debug.Log(" content:" + dataClass.listData[j].content); } } } void Update() { if (Input.GetKeyDown(KeyCode.Space)) { dataClassList[0].name = "重新取名字"; jsonContent = JsonMapper.ToJson(dataClassList); } } }
第8行和第15行的兩個Class,是依照JSON的兩層Array架構去宣告的,Class名稱可以任意,但是裡面的變數名稱和變數類型一定要完全和JSON的資料一樣。
第28行到第30行是展示用原本的原始方式來取資料。
第33行開始是把JSON字串轉成JSONObject,並套到之前宣告的資料模型內,這樣便可以隨心所欲地提取資料了。
第61行是展示用這種資料模型方式來儲存修改的資料,之後便可依照各自需求把修改後的JSON字串發出去。
程式裡我有弄兩種方式顯示資料,這邊只顯示其中一種,執行程式後在Unity的Console可以看得到:
在使用JSON時最麻煩的是資料被包了又包、包了又包,動輒就好幾層;因此使用這種資料模型的方式時也得去宣告相對應的Class,反而實作只需一行便可取得資料了。