当前位置:   article > 正文

1.10 Unity中的数据存储 JSON_unity json

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语法示例:

  1. {"students":[
  2. {
  3. "name":"albert",
  4. "age":19,
  5. "sex":"M"
  6. },
  7. {
  8. "name":"mary",
  9. "age":11,
  10. "sex":"W"
  11. }
  12. ]
  13. }

解析成实体类后:

  1. public class StudentsItem
  2. {
  3. public string name { get; set; }
  4. public int age { get; set; }
  5. public string sex { get; set; }
  6. }
  7. public class Root
  8. {
  9. public List <StudentsItem > students { get; set; }
  10. }

由于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文件放入即可

四、示例

  1. using System.Json;
  2. using UnityEngine;
  3. public class JsonTest : MonoBehaviour
  4. {
  5. void Start()
  6. {
  7. //创建⼀个JSON对象,相当于⼀个⼤括号
  8. JsonObject jsonTransform = new JsonObject();
  9. //创建⼀个JSON值对象,存储⼀个Value
  10. JsonValue jsonPosition = "10,20,30";
  11. //JSON对象,也就是⼤括号,添加⼀个key:value
  12. jsonTransform.Add("position", jsonPosition);
  13. //打印结果
  14. Debug.Log(jsonTransform.ToString());
  15. //定义⼀个值数组,⽤来存储,中括号中的⼀个个的值
  16. JsonValue[] rotationXYZ = new JsonValue[] { 20, 30, 40 };
  17. //将这个数组中的⼀个个的值放到JsonArray数组对象中
  18. JsonArray jsonRotation = new JsonArray(rotationXYZ);
  19. //⼀个JsonArray对象,也可以是⼀个Value,
  20. //所以可以⽤jsonTransform来Add
  21. jsonTransform.Add("rotation", jsonRotation);
  22. //打印结果
  23. Debug.Log(jsonTransform);
  24. JsonObject x = new JsonObject();
  25. x.Add("x", 10);
  26. JsonObject y = new JsonObject();
  27. y.Add("y", 20);
  28. JsonObject z = new JsonObject();
  29. z.Add("z", 30);
  30. //实例⼀个jsonValues数组(所有类型都可以转换成jsonValue)
  31. JsonValue[] scaleXYZ = new JsonValue[] { x, y, z };
  32. //将实例好了的数组,添加到jsonArray对象中,形成⼀个jsonArray对象
  33. //作⽤在于给这个整体,添加⼀个中括号[]
  34. JsonArray jsonScale = new JsonArray(scaleXYZ);
  35. //将这个整体,放⼊到jsonTransform中
  36. jsonTransform.Add("scale", jsonScale);
  37. //打印结果
  38. Debug.Log(jsonTransform);
  39. }
  40. }

打印结果:

五、LitJson

常用API方法如下:

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

1.生成

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

  1. using System.IO;
  2. using UnityEngine;
  3. [System.Serializable]
  4. class Person
  5. {
  6. public string Name;
  7. public int Age;
  8. }
  9. [System.Serializable]
  10. class Data
  11. {
  12. public Person[] Person;
  13. }
  14. public class NewBehaviourScript : MonoBehaviour
  15. {
  16. void Start()
  17. {
  18. WriteData();
  19. }
  20. //写数据
  21. public void WriteData()
  22. {
  23. //新建一个数据类
  24. Data m_Data = new Data();
  25. //新建一个字段类 进行赋值
  26. m_Data.Person = new Person[3];
  27. for (int i = 0; i < 3; i++)
  28. {
  29. Person m_Person = new Person();
  30. m_Person.Name = "User" + i;
  31. m_Person.Age = 20 + i;
  32. m_Data.Person[i] = m_Person;
  33. }
  34. //将数据转成json
  35. string js = JsonUtility.ToJson(m_Data);
  36. //获取到项目路径
  37. string fileUrl = Application.dataPath + "\\jsonInfo.txt";
  38. //打开或者新建文档
  39. using (StreamWriter sw = new StreamWriter(fileUrl))
  40. {
  41. //保存数据
  42. sw.WriteLine(js);
  43. //关闭文档
  44. sw.Close();
  45. sw.Dispose();
  46. }
  47. }
  48. }

2.解析

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

  1. using System.IO;
  2. using UnityEngine;
  3. [System.Serializable]
  4. class Person
  5. {
  6. public string Name;
  7. public int Age;
  8. }
  9. [System.Serializable]
  10. class Data
  11. {
  12. public Person[] Person;
  13. }
  14. public class NewBehaviourScript : MonoBehaviour
  15. {
  16. void Start()
  17. {
  18. string jsonData = ReadData();
  19. Data m_PersonData = JsonUtility.FromJson<Data>(jsonData);
  20. foreach (Person item in m_PersonData.Person)
  21. {
  22. Debug.Log(item.Name);
  23. Debug.Log(item.Age);
  24. }
  25. }
  26. //读取文件
  27. public string ReadData()
  28. {
  29. //string类型的数据常量
  30. string readData;
  31. //获取到路径
  32. string fileUrl = Application.dataPath + "\\jsonInfo.json";
  33. //读取文件
  34. using (StreamReader sr = File.OpenText(fileUrl))
  35. {
  36. //数据保存
  37. readData = sr.ReadToEnd();
  38. sr.Close();
  39. }
  40. //返回数据
  41. return readData;
  42. }
  43. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/794105
推荐阅读
相关标签
  

闽ICP备14008679号