Unity数据存储学习——创建、存储、读取Json文件

一、前期准备:

1、Json库:Json有很多库,个人喜欢使用LitJson.dll

(PS:这个库,大家自己网上搜吧,我这边不知道怎么上传,也不太清楚我使用的库具体是几年前的了,就不贴)

另外,可能版本问题,由于测试中发现两个问题:

(1)数据转换成json格式时发生改变:限定好float保留小数点后1位,结果转为Json,保存的数据小数点后位数会出现不止一位的问题;

(2)保存的Json数据在文件里一行存储,看着挺不舒服的;

故格式转换和存储一些部分使用Newtonsoft.Json的API,而不是LitJson;

2、小技巧:限定float小数点后几位:

(1)Mathf.Round();(2)Math.Round(Double num1,Int32 num2);(3)String.Format(string value,F1);(4)value.ToString("0.0");

有需要的可以看我的另一篇学习文章:

C# 数据处理——(包括但不限)浮点数设置小数点后位数_逍遥乐平的博客-CSDN博客

二、 Json格式文件存储读取

1、数据Datas类

(1)这里使用类以清晰、方便的保存多个数据,也可以不使用类,直接存储某个某些数据等。

(2)简单说明Json格式存储读取数据,只使用了简单的数据类型,复杂的比如List列表,Array数组,enum枚举等等可自己添加使用;

(3)要序列化和反序列化类,要添加可序列化标记:[Serializable]

using System;

[Serializable]
public class Datas 
{
    public string title;
    public int A;
    public float ValueB;
    public float cst;
}

2、文件file:

(1)存储的路径filePath:

1)路径可以在用的时候再申明个局部变量,也可以直接创建一个全局变量。个人更喜欢使用全部变量,不用反复修改创建。

2)我这里是存储为json文件,文件名为jsonDatas.json,也可以保存为txt文件,文件名改为jsonDatas.txt;同理其他文件格式;

2)关于文件存储地址:

①Resources文件夹:用来存放资源的特殊文件夹,仅在unity编辑器里使用,unity可以方便快速加载Resources文件夹里的资源。

filePath  = "jsonDatas.txt";//路径名,资源已经在Resources文件夹中了

Resources.Load(filePath);//直接读取Resources文件夹下的指定资源,路径不需要加Resources文件夹前缀。

②Assets/xx/xx.xxx路径:Asset文件夹下任意位置任意资源,也仅是在编辑器环境下运行使用。打包后不存在Asset文件。

③streamingAssets文件夹:流文件夹,一般是预存的信息,不要改动 ;在打包后项目运行时只能读不能写,不同平台该文件的路径也不同。一般将初始的AssetsBundle资源放在该文件夹下

④Application.dataPath路径:相对项目工程安装位置的相对路径,

⑤Application.streamingAssetsPath路径:

⑥Application.persistenDataPath路径:和项目安装位置无关的绝对路径,是用户信息,保存用户数据,升级版本不会影响到这些数据;

⑦Application.temporaryCachePath路径:是用来放缓存和临时的,用户可以清理掉;

考虑多平台的话,尽量存到Application.persistenDataPath;

(2)判断是否存在目标文件/是否有存档(文件)

可以使用File.Exists(FilePath),来判断目标文件是否存在;

public Ddatas datas;//数据
public string filePath;//存档路径

private void Awake()
    {
        filePath = Application.persistentDataPath + "/jsonDatas.json";
    }

private void OnEnable()
    {
        //if (!Directory.Exists(filePath))
        if (!File.Exists(filePath))
        {
            Debug.Log("本地没有存档");
            ......
            ......
            SaveDatasJson();//存档
        }
        ReadDatasJson();//读档
    }

 3、数据存储和读取

(1)这里使用到Json库,可以选择LitJson库也可以选择.net的Json;

我这里列出三种转换格式,前两种转换后生成的文件,打开后,是一堆数据,没有格式;不方便阅读查看。

没注释的是最后选择使用的,生成的json文件里数据,有换行显示,看起来比较舒服易读;

(2)数据读写用得到using System.IO命名空间;

包括后面的读取文件,也是要使用using System.IO命名空间。

using System.IO;

(3) 数据转换数据流进行读写操作

1)将目标数据转为数据流

如:string jsonStr = JsonMapper.ToJson(tempDatas);

2)根据给的路径查找文件:

StreamWriter sw = new StreamWriter(FilePath);

这里会自动根据给的路径查找文件,文件存在则读写文件,文件不存在会根据路径新建文件,再进行读写;
2)将数据流进行写入或读出

sw.WriteLine(jsonStr);//写入

string ReadStr = sr.ReadToEnd();//读出

3)结束读写操作后,记得关闭数据流:

sw.Close();

(4)存储数据示例(以Json格式文件为例)

//存储为Json格式Json文件    
private void SaveDatasJson()
    {
        Datas tempDatas = datas;
        //将Datas的数据转换为Json格式数据
        //string jsonStr = JsonMapper.ToJson(tempDatas);//使用LitJson库
        //string jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(tempDatas);//使用.net的Json库
        string jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(tempDatas,Newtonsoft.Json.Formatting.Indented);//规范Json数据格式
        //根据文件路径,创建/打开目标文件,使用到I/O;
        StreamWriter sw = new StreamWriter(FilePath);
        //把Json数据写入文件中
        sw.WriteLine(jsonStr);
        //关闭数据流
        sw.Close();

        Debug.Log("保存成功");
    }

(5)读取数据示例:读取数据并转为所需要的格式; 

//读取Json文件数据,并把数据转回目标格式赋值目标数据    
private void ReadDatasJson()
    {
        if (!File.Exists(FilePath))
        {
            Debug.Log("找不到存档文件");
        }
        else
        {
            //根据文件路径创建数据流
            StreamReader sr = new StreamReader(FilePath);
            //读取Json数据
            string ReadStr = sr.ReadToEnd();
            //关闭数据流
            sr.Close();
            //将获取到的Json数据转为Datas类数据,使用到LitJson库
            Ddatas tempDatas= JsonMapper.ToObject(ReadStr);
            //把读取的数据赋值给目标数据
            datas= tempDatas;

            Debug.Log("本地存档读取赋值成功");
        }
    }

注:草稿到现在,中间隔得有点久了,有的想不起来了,后面想起来有空在补充。。。。 

你可能感兴趣的:(数据存储,unity,c#,json)