筆記31 Json系統的創建與解析
數據的格式
Json
Json的格式化、映射
Json的創建(系統方式JsonUtility)
簡單(一組信息)
複雜(多組信息)
Json的解析(系統方式JsonUtility)
Json的創建和解析+代碼(第三方插件LitJson之法一)
using LitJson;
//添加名稱空間using LitJson;
public class Hero
{
public string name;
public int age;
}
public class Heros
{
public Hero[] heros;
}
public class LigJson : MonoBehaviour
{
void Start()
{
//調用第一種創建和解析Json的方法
func1();
}
void func1()
{
//第一種創建和解析Json的方法
Hero hero1 = new Hero();
hero1.name = "超人";
hero1.age = 35;
Hero hero2 = new Hero();
hero2.name = "蝙蝠俠";
hero2.age = 34;
//數組
Heros heros = new Heros();
heros.heros = new Hero[] { hero1, hero2 };
//創建。
//如果是系統方法。轉Json就用ToJson。接着Debug出來。
string jsonStr = JsonMapper.ToJson(heros);
Debug.Log(jsonStr);
//結果:{"heros":[{"name":"\u8D85\u4EBA","age":35},{"name":"\u8759\u8760\u4FA0","age":34}]}
//它會將所有的中文轉成Unicode編碼。
//解析。解析方法ToObject<解析完是什麼類型的Heros>(要解析的字符串jsonStr)
Heros hs = JsonMapper.ToObject<Heros>(jsonStr);
//打印、遍歷都行。此處打印結果:蝙蝠俠。
Debug.Log(hs.heros[1].name);
}
}
Json的創建和解析(第三方插件LitJson之法二)
創建:簡單(一組信息)
不要忘記:添加名稱空間using LitJson;
創建和解析:複雜(多組信息)——代碼(常用)
ing LitJson;
//添加名稱空間using LitJson;
public class LigJson : MonoBehaviour
{
void Start()
{
//調用第二種創建Json的方法。此處因爲調用func3,才註釋掉func2
//func2();
//調用第二種解析Json的方法
func3();
}
void func2()
{
//第二種創建和解析Json的方法
//例如想創建最簡單的格式{"name":"超人", "age": 35}。不想寫上面的類。
//JsonData代表了Json中的各種類型。
JsonData jd1 = new JsonData();
//JsonType.出現可選擇的基本類型。
//類就代表字典,所以Object代表大括號。Array代表數組,也就是中括號。
//這行代碼可以省略。此處顯示出來,就是一個大括號,就是一個對象。超人是Object
jd1.SetJsonType(JsonType.Object);
//賦值就按照字典的方式賦值
jd1["name"] = "超人";
jd1["age"] = 35;
JsonData jd2 = new JsonData();
jd2.SetJsonType(JsonType.Object);
jd2["name"] = "蝙蝠俠";
jd2["age"] = 37;
//注意它倆在一個數組,所以是Array
JsonData jds = new JsonData();
jds.SetJsonType(JsonType.Array);
//放入方法,和一般的數組一樣,用Add
jds.Add(jd1);
jds.Add(jd2);
//此時打印Debug.Log(jds.ToJson());,結果缺少在外層的大括號。
//結果:[{"name":"\u8D85\u4EBA","age":35},{"name":"\u8759\u8760\u4FA0","age":37}]
//添加最外層的大括號。又是Object了
JsonData heroJD = new JsonData();
heroJD.SetJsonType(JsonType.Object);
//它只有一個鍵值對
heroJD["heros"] = jds;
//ToJson就是把當前的JsonData轉成對應的Json
Debug.Log(heroJD.ToJson());
//結果:{"heros":[{"name":"\u8D85\u4EBA","age":35},{"name":"\u8759\u8760\u4FA0","age":37}]}
}
//調用第二種解析Json的方法
void func3()
{
//現在拿到一個Json
string jsonStr = "{'heros':[{'name':'超人', 'age':35},{'name':'蝙蝠俠','age':37}]}";
//解析。最後拿到的還是JsonData。解析ToObject<最外層herosJD是什麼類型Heros>
//而第二種解析方法就是不用泛型,直接把jsonStr放小括號裏。它返回的類型都變成JsonData了。
JsonData herosJD = JsonMapper.ToObject(jsonStr);
//數組
JsonData heros = herosJD["heros"];
//快速遍歷
foreach(JsonData heroJD in heros)
{
// Debug.Log(heroJD["name"]);得到的name還是JsonDate類型。
//
Debug.Log(heroJD["name"].ToString() + " " + (int)heroJD["age"]);
}
}
}