这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战
推荐阅读
- CSDN主页
- GitHub开源地址
- Unity3D插件分享
- 简书地址
- 我的个人博客
- QQ群:1040082875
大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
一、前言
在程序开发中,经常会遇到要从外部文件中读取数据的情况,文件类型也比较多。
于是,小魔龙就将常见的文件类型:Txt、Json、Xml、Excel、Csv,读取、修改、保存等常见操作代码总结下来。
一方面可以自己复习,另一方面也希望可以帮助更多的人吧。
这是本系列文章第二篇: 【Unity3D读取数据】(一)Txt文档操作(创建、读取、写入、修改) 【Unity3D读取数据】(二)Json文件操作(创建、读取、解析、修改) 【Unity3D读取数据】(三)Xml文件操作(创建、读取、写入、修改) 【Unity3D读取数据】(四)Excel文件操作(创建、读取、写入、修改) 【Unity3D读取数据】(五)Csv文件操作(创建、读取、写入、修改)
二、唠叨两句
读取Json文件,还是第一篇的读取的方式,但是数据读取完之后的解析就要留点心了。
首先,Json的格式跟在代码设置的自定义类的格式一定要一一对应,错一个字母都不行,还区分大小写。
那么,接收到的JSON数据怕生成类的时候出错怎么办,这时候就可以使用JSON数据转实体的功能: www.json.cn/json/json2c… 下面就来看一下如何创建、读取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、如果不牵扯到服务器的数据,都是本地数据的存写的话,最好存写都自己来写