在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 GetListFromJson(string path)
    {//获取json数据
        string str = File.ReadAllText(Application.dataPath + path, Encoding.GetEncoding("UTF-8"));//读取Json字符串
        if (str == null) Debug.LogError("未找到目标资源:" + path);
        List list = JsonMapper.ToObject>(str);//使用Litjson的方法将字符串转化为链表
        return list;
    }
    public static void SetJsonFromList(string path, List 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;
    public Dictionary dic = new Dictionary();

    public static T GetModelById(int id) where T : Model
    {
        Dictionary subdic = GetModelDic();
        if (subdic != null)
        {
            if (!subdic.ContainsKey(id))
            {
                Debug.Log("不存在" + id);
                return null;
            }
            return subdic[id];
        }

        else
        {
            Debug.Log("字典为空");
            return null;
        }
    }
    public static Dictionary GetModelDic() where T : Model
    {
        string classname = typeof(T).ToString();
        if (instance.dic.ContainsKey(classname))
        {

            return instance.dic[classname] as Dictionary;
        }

        else
        {

            Dictionary subdic = new Dictionary();
            List ls = JsonDataTool.GetListFromJson(instance.jsonDataFolderPath + "/" + classname + ".json");
            foreach (var i in ls)
            {
                subdic.Add(i.id, i);
            }

            instance.dic.Add(classname, subdic);
            return subdic;
        }
    }

}

你可能感兴趣的:(在unity中实现json数据的通用读写)