笔记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"]);
}
}
}