数据的本地存储——Json
Json的操作和解析:
有两种方式:1、unity5.3之后自带的JSonUtility类库;2、第三方插件LitJSon库。
在unity中创建一个空物体,给空物体加一个脚本如图:
编辑脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
/// <summary>
/// Unity自带的JSonUtility
/// </summary>
public class JsonUtilityDemo : MonoBehaviour {
void Start () {
//1、JsonUtility类库:
//使用代码方式创建一个Json
//例如这样的:{ 'name':'宝宝','age':18} 单引号、双引号都行
Person p1 =new Person();
p1.name ="宝宝";
p1.age = 18;
//转成JSon字符串
string jsonStr = JsonUtility.ToJson(p1);
//Debug.Log(jsonStr); //{ "name":"宝宝","age":18}
//再例如这样的:{"Persons":{["name":"宝宝","age":18],["name":"小杰","age":16]}}
Person p2 =new Person();
p2.name ="小杰";
p2.age = 16;
Person[] ps =new Person[] { p1, p2 };
Persons psons =new Persons();
psons.persons = ps;
jsonStr = JsonUtility.ToJson(psons);
//Debug.Log(jsonStr); //{"persons":[{"name":"宝宝","age":18},{"name":"小杰","age":16}]}
//解析JSon(看传过来的JSon结构,根据JSon结构构造相应的类)
//比如上面的jsonStr="{"persons":[{"name":"宝宝","age":18},{"name":"小杰","age":16}]}"
//需要一个persons类,包含person数组,person数组有两个元素,这里已经创建了这两个类
Persons newPerson = JsonUtility.FromJson<Persons>(jsonStr);
Debug.Log(newPerson.persons[0].name); //宝宝
}
}
/// <summary>
/// Person类
/// unity自带的JsonUtility需要的序列化
/// 这样可以和JSon相互转化
/// </summary>
[Serializable]
public class Person
{
public string name;
public int age;
}
[Serializable]
public class Persons
{
public Person[] persons;
}
2、使用第三方插件LitJSon来创建与解析JSon
下载LitJSon的.dll文件,将dll文件放在Plugins文件夹下,如图:
编辑代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;//LitJson命名空间
using System;
/// <summary>
/// 利用第三方插件LitJSon来创建与解析JSon
/// </summary>
public class LitJsonDemo : MonoBehaviour {
void Start () {
//有两种方法创建和解析JSon:
// Function1();
// Function2();
Analytic();
}
void Function1()
{
//创建JSon(和unity自带的JSonUtility创建相同)
//比如{"Heros":[{"name":"超人","power":18},{"name":"蝙蝠侠","power":16}]}
//则先创建符合该类型的类,再创建类的对象
Hero hero1 =new Hero();
hero1.name ="超人";
hero1.power = 18;
Hero hero2 =new Hero();
hero2.name ="蝙蝠侠";
hero2.power = 16;
Hero[] hero =new Hero[] { hero1, hero2 };
Heros hrs =new Heros();
hrs.heros = hero;
string jsonStr = JsonMapper.ToJson(hrs);
//Debug.Log(jsonStr); //打印出中文是UTF8编码,不用管,取出则为正常
//解析JSon 泛型
Heros newHero = JsonMapper.ToObject<Heros>(jsonStr);
//Debug.Log(newHero.heros[1].name); //蝙蝠侠
}
void Function2()
{
//创建JSon
//比如{"name":"超人","power":18}或者{"heros":[{"name":"超人","power":18},{"name":"蝙蝠侠","power":16}]}
//不需要创建类直接创建JSon
//1、创建类似这样简单的JSon{ "name":"超人","power":18}
JsonData creatJsonData =new JsonData(); //JSonData即代表{}也代表[]
//设置JSon类型 如果像这样的一眼可以看出的{"name":"超人","power":18},也可以不需要指定类型,系统会自动识别
//creatJsonData.SetJsonType(JsonType.Object);
creatJsonData["name"] = "超人";
creatJsonData["power"] = 18;
string json = creatJsonData.ToJson();
//Debug.Log(json);
//2、创建类似这样复杂一点的JSon{ "heros":[{"name":"超人","power":18},{"name":"蝙蝠侠","power":16}]}
JsonData herosJsonData =new JsonData(); //{}代表最外层花括号
JsonData heroJsonData1 =new JsonData(); //{}内层花括号
heroJsonData1["name"] = "超人";
heroJsonData1["power"] = 18;
JsonData heroJsonData2 =new JsonData(); //{}内层花括号
heroJsonData2["name"] = "蝙蝠侠";
heroJsonData2["power"] = 16;
JsonData heros =new JsonData(); //[]heros数组
heros.SetJsonType(JsonType.Array);//设置JSon类型
heros.Add(heroJsonData1);
heros.Add(heroJsonData2);
herosJsonData["heros"] = heros;
Debug.Log(herosJsonData.ToJson());
//解析Analytic()
}
//对第二种方案的解析
private void Analytic()
{
string jsonStr="{ 'Heros':[{'name':'超人','power':18},{'name':'蝙蝠侠','power':16}]}";
JsonData herosJson = JsonMapper.ToObject(jsonStr);
JsonData heros = herosJson["Heros"]; //[]
//heros[0]["name"]
//遍历
foreach(JsonData heroJsonin heros)
{
//Debug.Log(heroJson["name"]);
//Debug.Log(heroJson["power"]);
Debug.Log(heroJson["name"].ToString());
Debug.Log((int)heroJson["power"]);
}
}
}
[System.Serializable]
public class Hero
{
public string name;
public int power;
}
[System.Serializable]
public class Heros
{
public Hero[] heros;
}