Unity中的Json数据读写与解析

一、前言

在日常开发中,会遇到要保存数据,或者发送数据的需求,数据保存通常用Json或者XML,今天我们就来看一下如何在Unity中读写Json数据,以及解析Json数据,包括多段数据的解析

二、单条Json数据的读写、解析

1.单条Json数据的写入

首先,我们先写一个字段类Person,类里面有string类型的“Name”和int类型的“Grade”,然后写一个"Data”数据类,里面存放的使我们的字段类Person:

登录后复制

[System.Serializable]
class Person
{
    public string Name;
    public int Grade;
}
[System.Serializable]
class Data
{
    public Person Person;
}
1.2.3.4.5.6.7.8.9.10.11.

首先是写Json数据:

登录后复制

	//写数据
    public void WriteData()
    {
    	//新建一个字段类 进行赋值
        Person m_Person = new Person();
        m_Person.Name = "User1";
        m_Person.Grade = 13;
        //新建一个数据类 将字段类赋值
        Data m_Data = new Data();
        m_Data.Person = m_Person;
        //将数据转成json
        string js = JsonUtility.ToJson(m_Data);
        //获取到项目路径
        string fileUrl = Application.streamingAssetsPath + "\\jsonInfo2.txt";
        //打开或者新建文档
        StreamWriter sw = new StreamWriter(fileUrl);
        //保存数据
        sw.WriteLine(js);
        //关闭文档
        sw.Close();
    }
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.

对啦,你要新建一个StreamingAssets文件夹,不然会报错:
【Unity3D日常】Unity写Json数据,以及在Unity读取、解析Json数据_Unity
数据如下:
【Unity3D日常】Unity写Json数据,以及在Unity读取、解析Json数据_数据_02
用网站解析也没有问题:
【Unity3D日常】Unity写Json数据,以及在Unity读取、解析Json数据_数据_03

2.单条Json数据的读取

读取就很简单:

登录后复制

	//读取文件
    public string ReadData()
    {
    	//string类型的数据常量
        string readData = "";
        //获取到路径
        string fileUrl = Application.streamingAssetsPath+ "\\jsonInfo2.txt";
        //读取文件
        StreamReader str = File.OpenText(fileUrl);
        //数据保存
        readData = str.ReadToEnd();
        str.Close();
        //返回数据
        return readData;
    }
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.

来,让我们来获取一下数据看对不对:

登录后复制

	void Start()
    {
        string jsonData = ReadData();
        Debug.Log(jsonData);
    }
1.2.3.4.5.

看控制台输出:
【Unity3D日常】Unity写Json数据,以及在Unity读取、解析Json数据_Unity_04

3.单条Json数据的解析

登录后复制

	void Start()
    {
        string jsonData = ReadData();
        Debug.Log(jsonData);
        //数据解析并把数据保存到m_PersonData变量中
		Data m_PersonData = JsonUtility.FromJson<Data>(jsonData);
		//读取数据
        Debug.Log(m_PersonData.Person.Name);
        Debug.Log(m_PersonData.Person.Grade);
    }
1.2.3.4.5.6.7.8.9.10.

【Unity3D日常】Unity写Json数据,以及在Unity读取、解析Json数据_Json_05
完整代码如下:

登录后复制

using System.IO;
using UnityEngine;

[System.Serializable]
class Person
{
    public string Name;
    public int Grade;
}
[System.Serializable]
class Data
{
    public Person Person;
}

public class TestToJson : MonoBehaviour
{
    void Start()
    {
        //WriteData();
        string jsonData = ReadData();
        Debug.Log(jsonData);

        Data m_PersonData = JsonUtility.FromJson<Data>(jsonData);
        Debug.Log(m_PersonData.Person.Name);
        Debug.Log(m_PersonData.Person.Grade);
    }


    //读取文件
    public string ReadData()
    {
        string readData = "";
        string fileUrl = Application.streamingAssetsPath+ "\\jsonInfo2.txt";
        StreamReader str = File.OpenText(fileUrl);
        readData = str.ReadToEnd();
        str.Close();
        return readData;
    }

    //写数据
    public void WriteData()
    {
        Person m_Person = new Person();
        m_Person.Name = "User1";
        m_Person.Grade = 13;
        Data m_Data = new Data();
        m_Data.Person = m_Person;
        string js = JsonUtility.ToJson(m_Data);
        string fileUrl = Application.streamingAssetsPath + "\\jsonInfo2.txt";
        StreamWriter sw = new StreamWriter(fileUrl);
        sw.WriteLine(js);
        sw.Close();
    }
}

1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.

三、多条Json数据的读写、解析

1.多条Json数据的写入

首先,我们先写一个字段类Person,类里面有string类型的“Name”和int类型的“Grade”,然后写一个"Data1”数据类,里面存放的使我们的字段类Person数组:

登录后复制

[System.Serializable]
class Person
{
    public string Name;
    public int Grade;
}
[System.Serializable]
class Data1
{
    public Person[] Person;
}
1.2.3.4.5.6.7.8.9.10.11.

首先是写Json数据:

登录后复制

	//写数据
    public void WriteData()
    {
        //新建一个数据类
        Data1 m_Data = new Data1();
        //新建一个字段类 进行赋值
        m_Data.Persons = 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.Persons[i] = m_Person;
        }
        //将数据转成json
        string js = JsonUtility.ToJson(m_Data);
        //获取到项目路径
        string fileUrl = Application.streamingAssetsPath + "\\jsonInfo3.txt";
        //打开或者新建文档
        StreamWriter sw = new StreamWriter(fileUrl);
        //保存数据
        sw.WriteLine(js);
        //关闭文档
        sw.Close();
    }
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.

对啦,你要新建一个StreamingAssets文件夹,不然会报错:
【Unity3D日常】Unity写Json数据,以及在Unity读取、解析Json数据_Unity
数据如下:
【Unity3D日常】Unity写Json数据,以及在Unity读取、解析Json数据_Json_07
用网站解析也没有问题:
【Unity3D日常】Unity写Json数据,以及在Unity读取、解析Json数据_json_08

2.多条Json数据的读取

读取就很简单:

登录后复制

	//读取文件
    public string ReadData()
    {
    	//string类型的数据常量
        string readData = "";
        //获取到路径
        string fileUrl = Application.streamingAssetsPath+ "\\jsonInfo3.txt";
        //读取文件
        StreamReader str = File.OpenText(fileUrl);
        //数据保存
        readData = str.ReadToEnd();
        str.Close();
        //返回数据
        return readData;
    }
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.

来,让我们来获取一下数据看对不对:

登录后复制

	void Start()
    {
        string jsonData = ReadData();
        Debug.Log(jsonData);
    }
1.2.3.4.5.

看控制台输出:
【Unity3D日常】Unity写Json数据,以及在Unity读取、解析Json数据_Unity_09

3.多条Json数据的解析

登录后复制

	void Start()
    {
        string jsonData = ReadData();
        Debug.Log(jsonData);
        //数据解析并把数据保存到m_PersonData1 变量中
        Data1 m_PersonData1 = JsonUtility.FromJson<Data1>(jsonData);
        foreach (var item in m_PersonData1.Persons)
        {
            Debug.Log(item.Name);
            Debug.Log(item.Grade);
        }
    }
1.2.3.4.5.6.7.8.9.10.11.12.

【Unity3D日常】Unity写Json数据,以及在Unity读取、解析Json数据_json数据_10
完整代码如下:

登录后复制

using System.IO;
using UnityEngine;

[System.Serializable]
class Person
{
    public string Name;
    public int Grade;
}
[System.Serializable]
class Data
{
    public Person Person;
}
[System.Serializable]
class Data1
{
    public Person[] Persons;
}

public class TestToJson : MonoBehaviour
{
    void Start()
    {
        //WriteData2();
        //WriteData3();
        
		//单条数据
        //string jsonData = ReadData();
        //Debug.Log(jsonData);
        //Data m_PersonData = JsonUtility.FromJson<Data>(jsonData);
        //Debug.Log(m_PersonData.Person.Name);
        //Debug.Log(m_PersonData.Person.Grade);

		//多条数据
        string jsonData = ReadData();
        Debug.Log(jsonData);
        Data1 m_PersonData1 = JsonUtility.FromJson<Data1>(jsonData);
        foreach (var item in m_PersonData1.Persons)
        {
            Debug.Log(item.Name);
            Debug.Log(item.Grade);
        }
    }


    //读取文件
    public string ReadData()
    {
        string readData = "";
        string fileUrl = Application.streamingAssetsPath+ "\\jsonInfo3.txt";
        StreamReader str = File.OpenText(fileUrl);
        readData = str.ReadToEnd();
        str.Close();
        return readData;
    }

    //写数据
    public void WriteData2()
    {
        Person m_Person = new Person();
        m_Person.Name = "User1";
        m_Person.Grade = 13;
        Data m_Data = new Data();
        m_Data.Person = m_Person;
        string js = JsonUtility.ToJson(m_Data);
        string fileUrl = Application.streamingAssetsPath + "\\jsonInfo2.txt";
        StreamWriter sw = new StreamWriter(fileUrl);
        sw.WriteLine(js);
        sw.Close();
    }

    //写数据
    public void WriteData3()
    {
        Data1 m_Data = new Data1();
        m_Data.Persons = 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.Persons[i] = m_Person;
        }
        string js = JsonUtility.ToJson(m_Data);
        string fileUrl = Application.streamingAssetsPath + "\\jsonInfo3.txt";
        StreamWriter sw = new StreamWriter(fileUrl);
        sw.WriteLine(js);
        sw.Close();
    }
}
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.


总结:

1.不要自己写json串,不然一个中括号或者花括号写错就死活解不出来

2.需要先明确自己接收的json串的格式,然后再写自己的数据类

3.如果不牵扯到服务器的数据,都是本地数据的存写的话,最好存写都自己来写



免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空