在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;
    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;
        }
    }

}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值