一、前言
在程序开发中,经常会遇到要从外部文件中读取数据的情况,文件类型也比较多。
于是,小魔龙就将常见的文件类型:Txt、Json、Xml、Excel、Csv,读取、修改、保存等常见操作代码总结下来。
一方面可以自己复习,另一方面也希望可以帮助更多的人吧。
这是本系列文章第一篇:
【Unity3D读取数据】(一)读取Txt数据
【Unity3D读取数据】(二)Json文件操作(创建、读取、解析、修改)
二、唠叨两句
读取Json文件,还是第一篇的读取的方式,但是数据读取完之后的解析就要留点心了。
首先,Json的格式跟在代码设置的自定义类的格式一定要一一对应,错一个字母都不行,还区分大小写。
那么,接收到的JSON数据怕生成类的时候出错怎么办,这时候就可以使用JSON数据转实体的功能:
https://www.json.cn/json/json2csharp.html
下面就来看一下如何创建、读取Json文件吧。
三、创建Json文件
如果有定义好的Json文件,我们就可以直接拿来验证一个格式,格式正确就可以正常使用了。
如果我们要先生成Json文件的,就可以使用IO命名空间的StreamWriter类:
首先,我们先写一个字段类Person,类里面有string类型的“Name”和int类型的“Grade”,然后写一个"Data1”数据类,里面存放的使我们的字段类Person数组:
[System.Serializable] class Person { public string Name; public int Grade; } [System.Serializable] class Data1 { public Person[] Person; }
然后生成Json数据,将Json数据保存到文件中:
using System.IO; using UnityEngine; [System.Serializable] class Person { public string Name; public int Grade; } [System.Serializable] class Data { public Person[] Person; } public class Demo5 : MonoBehaviour { void Start() { WriteData(); } //写数据 public void WriteData() { //新建一个数据类 Data m_Data = new Data(); //新建一个字段类 进行赋值 m_Data.Person = new Person[5]; for (int i = 0; i < 5; i++) { Person m_Person = new Person(); m_Person.Name = "User" + i; m_Person.Grade = i + 50; m_Data.Person[i] = m_Person; } //将数据转成json string js = JsonUtility.ToJson(m_Data); //获取到项目路径 string fileUrl = Application.streamingAssetsPath + "\\jsonInfo.txt"; //打开或者新建文档 using (StreamWriter sw =new StreamWriter(fileUrl)) { //保存数据 sw.WriteLine(js); //关闭文档 sw.Close(); sw.Dispose(); } } }
运行后,就会在本地项目的StreamingAssets文件中生成jsonInfo.json文件:
查看里面的数据:
在这里,我们是新建了两个数据实体类,一个叫Data一个叫Person,它们都有特性:[System.Serializable],也就是序列化,只有加上这个特性,类里面的数据才能正常的转成Json数据。
四、读取Json文件数据
4-1、读取数据
读取数据,我们使用IO命名空间下的File类的OpenText()函数进行读取:
using System.IO; using UnityEngine; public class Demo5 : MonoBehaviour { void Start() { string jsonData = ReadData(); Debug.Log(jsonData); } //读取文件 public string ReadData() { //string类型的数据常量 string readData; //获取到路径 string fileUrl = Application.streamingAssetsPath + "\\jsonInfo.json"; //读取文件 using (StreamReader sr =File.OpenText(fileUrl)) { //数据保存 readData = sr.ReadToEnd(); sr.Close(); } //返回数据 return readData; } }
运行结果:
4-2、解析数据
但是,光读取还不够,还需要将Json数据进行解析:
using System.IO; using UnityEngine; [System.Serializable] class Person { public string Name; public int Grade; } [System.Serializable] class Data { public Person[] Person; } public class Demo5 : MonoBehaviour { void Start() { string jsonData = ReadData(); Data m_PersonData = JsonUtility.FromJson<Data>(jsonData); foreach (Person item in m_PersonData.Person) { Debug.Log(item.Name); Debug.Log(item.Grade); } } //读取文件 public string ReadData() { //string类型的数据常量 string readData; //获取到路径 string fileUrl = Application.streamingAssetsPath + "\\jsonInfo.json"; //读取文件 using (StreamReader sr =File.OpenText(fileUrl)) { //数据保存 readData = sr.ReadToEnd(); sr.Close(); } //返回数据 return readData; } }
4-3、修改数据
想修改Json里面的某一个数据怎么办?
可以先将数据读取保存下来,然后遍历数据,找到这个数据进行修改,然后再保存到这个 json文件中即可。
比如,我们要找到“User2”,然后给成绩改为58:
using System.IO; using UnityEngine; [System.Serializable] class Person { public string Name; public int Grade; } [System.Serializable] class Data { public Person[] Person; } public class Demo5 : MonoBehaviour { void Start() { //读取数据 string jsonData = ReadData(); //解析数据 Data m_PersonData = JsonUtility.FromJson<Data>(jsonData); //找到数据修改数据 foreach (Person item in m_PersonData.Person) { if (item.Name == "User2") { item.Grade = 58; } } //转成json,然后保存数据 string json = JsonUtility.ToJson(m_PersonData); AlterData(json); } //读取文件 public string ReadData() { //string类型的数据常量 string readData; //获取到路径 string fileUrl = Application.streamingAssetsPath + "\\jsonInfo.json"; //读取文件 using (StreamReader sr = File.OpenText(fileUrl)) { //数据保存 readData = sr.ReadToEnd(); sr.Close(); } //返回数据 return readData; } //修改数据 public void AlterData(string content) { //获取到路径 string fileUrl = Application.streamingAssetsPath + "\\jsonInfo.json"; //读取文件 using (StreamWriter sr = new StreamWriter(fileUrl)) { //数据保存 sr.WriteLine(content); sr.Close(); } } }
这样就可以了
五、后言
1、不要自己写json串,不然一个中括号或者花括号写错就死活解不出来
2、推荐使用代码生成json数据,然后放到json格式解析的网站解析一下,看一下是否正确,然后再进行下一步的开发
3、需要先明确自己接受的json串格式,然后再写自己的数据解析实体类,最好是先将json接收过来,然后复制粘贴到json解析的网站解析格式,生成数据解析实体类,然后再复制到程序汇总。
4、如果不牵扯到服务器的数据,都是本地数据的存写的话,最好存写都自己来写