推荐阅读

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

在程序开发中,经常会遇到要从外部文件中读取数据的情况,文件类型也比较多。

于是,小魔龙就将常见的文件类型:Txt、Json、Xml、Excel、Csv,读取、修改、保存等常见操作代码总结下来。

一方面可以自己复习,另一方面也希望可以帮助更多的人吧。

这是本系列文章第二篇:
【Unity3D读取数据】(一)Txt文档操作(创建、读取、写入、修改)
【Unity3D读取数据】(二)Json文件操作(创建、读取、解析、修改)
【Unity3D读取数据】(三)Xml文件操作(创建、读取、写入、修改)
【Unity3D读取数据】(四)Excel文件操作(创建、读取、写入、修改)
【Unity3D读取数据】(五)Csv文件操作(创建、读取、写入、修改)

二、唠叨两句

读取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、如果不牵扯到服务器的数据,都是本地数据的存写的话,最好存写都自己来写

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐