1.10 Unity中的数据存储 JSON

一、介绍

  • Json是最常用也是目前用的比较多的一种,超轻量级,可便捷性使用,平时用到比较多的都是解析Json和往Json中添加数据、修改数据等等
  • JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式,它基于ECMAScript(w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率
  • 在Unity中大致有三种使用Json的方式
  • 分别是使用类库的两种:System.Json(便于JSON生成)和LitJson(便于JSON解析)
  • 还有一种是UnityEngine.Jsonutility
  • 其中前两种都需要将System.Json.dll或 LitJson.dll两个dll文件放到Unity的plugins文件夹中才能使用相应的命名空间和方法
  • UnityEngine.JsonUtility则可以直接使用其中的方法

二、语法规则

  • 数据都放置到一个大括号里
  • 一对对的数据放到大括号里
  • 一个个的数据放到中括号里
  • 一个大括号或一个中括号都可以表示一个值
  • 数据与数据之间用逗号分隔
  • Key必须要用引号引起来
  • Value如果是字符串要用引号引起来
  • 最后一个数据后面不要加逗号
  • 数据保存在键值对中

JSON语法示例:

{"students":[
	{
		"name":"albert",
		"age":19,
		"sex":"M"
	},
	{
		"name":"mary",
		"age":11,
		"sex":"W"
	}
	]
}

解析成实体类后:

public class StudentsItem
{
    public string name { get; set; }
    public int age { get; set; }
    public string sex { get; set; }
}
 
public class Root
{
    public List <StudentsItem > students { get; set; }
}

由于Json对字符串的格式非常严格,输入一个字符错误都不行,所以我们可以使用相关的Json转换网站进行格式转换
https://www.json.cn/json2csharp.html 这个网站就可以实现JSON数据转实体的功能

三、System.Json

先来说一下System.Json的基本用法
System.Json是一种类库,当我们在Unity中导入System.Json.dll文件后就可以使用System.Json.dll json命名空间
可以用到的类:JsonArray、JsonObject、JsonPrimitive、JsorValue。枚举:JsonType
具体操作,在Unity中新建一个Plugins文件夹,然后将dll文件放入即可

四、示例

using System.Json;
using UnityEngine;

public class JsonTest : MonoBehaviour
{
    void Start()
    {
        //创建⼀个JSON对象,相当于⼀个⼤括号
        JsonObject jsonTransform = new JsonObject();

        //创建⼀个JSON值对象,存储⼀个Value
        JsonValue jsonPosition = "10,20,30";
        //JSON对象,也就是⼤括号,添加⼀个key:value
        jsonTransform.Add("position", jsonPosition);
        //打印结果
        Debug.Log(jsonTransform.ToString());

        //定义⼀个值数组,⽤来存储,中括号中的⼀个个的值
        JsonValue[] rotationXYZ = new JsonValue[] { 20, 30, 40 };
        //将这个数组中的⼀个个的值放到JsonArray数组对象中
        JsonArray jsonRotation = new JsonArray(rotationXYZ);
        //⼀个JsonArray对象,也可以是⼀个Value,
        //所以可以⽤jsonTransform来Add
        jsonTransform.Add("rotation", jsonRotation);
        //打印结果
        Debug.Log(jsonTransform);

        JsonObject x = new JsonObject();
        x.Add("x", 10);
        JsonObject y = new JsonObject();
        y.Add("y", 20);
        JsonObject z = new JsonObject();
        z.Add("z", 30);
        //实例⼀个jsonValues数组(所有类型都可以转换成jsonValue)
        JsonValue[] scaleXYZ = new JsonValue[] { x, y, z };
        //将实例好了的数组,添加到jsonArray对象中,形成⼀个jsonArray对象
        //作⽤在于给这个整体,添加⼀个中括号[]
        JsonArray jsonScale = new JsonArray(scaleXYZ);
        //将这个整体,放⼊到jsonTransform中
        jsonTransform.Add("scale", jsonScale);
        //打印结果
        Debug.Log(jsonTransform);
    }
}

打印结果:

五、LitJson

常用API方法如下:

  • 把对象转化成JSON格式字符串:JsonMapper.ToJson
  • 把JSON格式字符串转化成对象:JsonMapper.ToObject
  • 把JSON格式字符串转化成指定类的对象:JsonMapper.ToObject

1.生成

我们写一个字段类Person,类里面有string类型的"Name"和int型的"Age"
 

using System.IO;
using UnityEngine;

[System.Serializable]
class Person
{
    public string Name;
    public int Age;
}
[System.Serializable]
class Data
{
    public Person[] Person;
}
public class NewBehaviourScript : MonoBehaviour
{
    void Start()
    {
        WriteData();
    }

    //写数据
    public void WriteData()
    {
        //新建一个数据类
        Data m_Data = new Data();
        //新建一个字段类 进行赋值
        m_Data.Person = new Person[3];
        for (int i = 0; i < 3; i++)
        {
            Person m_Person = new Person();
            m_Person.Name = "User" + i;
            m_Person.Age = 20 + i;
            m_Data.Person[i] = m_Person;
        }

        //将数据转成json
        string js = JsonUtility.ToJson(m_Data);
        //获取到项目路径
        string fileUrl = Application.dataPath + "\\jsonInfo.txt";

        //打开或者新建文档
        using (StreamWriter sw = new StreamWriter(fileUrl))
        {
            //保存数据
            sw.WriteLine(js);
            //关闭文档
            sw.Close();
            sw.Dispose();
        }
    }
}

2.解析

先读取Json文件,使用IO命名空间下的File类的OpenText()函数进行读取
然后使用JsonUtility.FromJson进行解析

using System.IO;
using UnityEngine;

[System.Serializable]
class Person
{
    public string Name;
    public int Age;
}
[System.Serializable]
class Data
{
    public Person[] Person;
}
public class NewBehaviourScript : 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.Age);
        }
    }

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

Unity游戏,可以使用JSON格式进行数据存储JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,通过简单的键值对来表示数据。可以使用LitJson.dll插件来实现在Unity读取和存储JSON数据。 以下是使用JSON进行数据存储的步骤: 1. 创建一个技能类(Skill),在该类封装需要存储的字段,比如Id和Name。 2. 创建Skill类型的List集合,并向其添加Skill对象。 3. 使用LitJsonJsonMapper.ToJson()方法将List集合转换为JSON格式的字符串。 4. 使用File.WriteAllText()方法将JSON字符串写入文件。 5. 为了防止文乱码,可以使用Regex.Replace()方法将转义字符转码为实际字符。 在Unity使用LitJson.dll插件来读取和存储JSON数据需要将LitJson.dll文件放入Unity的Plugins文件夹。编写相应的代码来实现读取和存储的功能。可以参考相关的教程或视频来学习更详细的使用方法。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Unity Json读取存储](https://download.csdn.net/download/qq_42126516/12251667)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [UnityJSON数据存储)](https://blog.csdn.net/m0_74427422/article/details/129540637)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [学习记录:unityjson存储](https://blog.csdn.net/shijinlinaaa/article/details/125896790)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值