在unity中实现json数据的通⽤读写
使⽤LitJson插件
LitJson使⽤
只需要把ListJson.dll拖进Unity Assets⽂件夹中即可在代码中引⽤。
我们先简单封装⼀下Litjson以便更⽅便于Unity使⽤。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;//引⼊插件
using System.IO;
using System.Text;
public class JsonDataTool
{
public static List<T> GetListFromJson<T>(string path)
{//获取json数据
string str = File.ReadAllText(Application.dataPath + path, Encoding.GetEncoding("UTF-8"));//读取Json字符串
if (str == null) Debug.LogError("未到⽬标资源:" + path);
List<T> list = JsonMapper.ToObject<List<T>>(str);//使⽤Litjson的⽅法将字符串转化为链表
return list;
}
public static void SetJsonFromList<T>(string path, List<T> list)//此⽅法常⽤于存档的实现
{//修改json数据
string jsonstr = JsonMapper.ToJson(list);
File.WriteAllText(Application.dataPath + path, jsonstr);
}
}
存为字典
对于获取的数据我们希望通过字典来存取,这样索引会更有效率。
游戏中有,道具,装备,以及⾓⾊对话等,它们的各个属性都不⼀样,如果已经接触过litjson,会意识到,Litjson虽然能⾃动封装数据,但这要求json数据的属性名要和实体类中的变量名⼀⼀对应。我们把Json数据的id作为字典的键,把实体类作为值。
我们采⽤⼆级字典存取所有的数据,将每⼀个实体类的类名作为键,那将什么作为值呢?使⽤基类object进⾏拆装包会是个不错的选择。
我们使⽤泛型⽅法GetModelDic()来懒加载字典,但是在代码中,⽆法知道T类型有哪些属性,也就⽆
法将它的id存为key值,所以我们可以采⽤where语句来告诉程序T是⼀个基础实体类(视所有json数据都有id这个属性),这样在代码中我们就能访问到T.id并存⼊字典。在使⽤GetModel < T >()⽅法时,会先判断字典中有⽆这个实体类的字典,⽆就⽣成,有就拆包为所需类型。
基础实体类代码
public abstract class Model
{
public int id;
public Model(){}
}
json数据管理类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class JsonDataCenterCL : MonoBehaviour
{
[Header("以下路径为在Assets中的路径")]
public static JsonDataCenterCL instance;
private void Awake()
{
instance = this;
//预加载的字典
}
public string jsonDataFolderPath;
json值的类型有哪些
public Dictionary<string, object> dic = new Dictionary<string, object>();
public static T GetModelById<T>(int id) where T : Model
{
Dictionary<int, T> subdic = GetModelDic<T>();
if (subdic != null)
{
if (!subdic.ContainsKey(id))
{
Debug.Log("不存在" + id);
return null;
}
return subdic[id];
}
else
{
Debug.Log("字典为空");
return null;
}
}
public static Dictionary<int, T> GetModelDic<T>() where T : Model
{
string classname = typeof(T).ToString();
if (instance.dic.ContainsKey(classname))
{
return instance.dic[classname] as Dictionary<int, T>;
}
else
{
Dictionary<int, T> subdic = new Dictionary<int, T>();
List<T> ls = JsonDataTool.GetListFromJson<T>(instance.jsonDataFolderPath + "/" + classname + ".json"); foreach (var i in ls)
{
subdic.Add(i.id, i);
}
instance.dic.Add(classname, subdic);
return subdic;
}
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论