当前位置:   article > 正文

Unity——JSON的读取

Unity——JSON的读取

一、读取JSON

在实际中,读取JSON比保存JSON重要得多。因为存档、发送数据包往往可以采用其他序列化方法,但游戏的配置文件使用JSON格式比较常见。游戏的配置数据不属于动态数据,属于游戏资源,但很适合用JSON表示。

下面以一个简单的JSON数据文件为例,演示读取JSON。从整体上看有两种思路

  • 直接整体反序列化为数据对象
  • 通过写代码逐步读取内容
  1. {
  2. "students": [
  3. {
  4. "name": "Alice",
  5. "age": 20,
  6. "major": "Computer Science"
  7. },
  8. {
  9. "name": "Bob",
  10. "age": 22,
  11. "major": "Engineering"
  12. },
  13. {
  14. "name": "Carol",
  15. "age": 21,
  16. "major": "Business"
  17. }
  18. ]
  19. }

1、整体反序列化

LitJSON库支持直接将JSON字符串反序列化为C#对象,但是为了方便使用,最好先准备一个数据结构与JSON完全对应的对象。示例如下:

  1. [System.Serializable]
  2. public class Student
  3. {
  4. public string name;
  5. public int age;
  6. public string major;
  7. }

这个类使用了[System.Serializable]属性,以便在序列化和反序列化 JSON 数据时能够正确处理。该类有三个属性,分别表示学生的姓名(name)、年龄(age)和专业(major)。

 用LitJson.JsonMapper方法实现反序列化

  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. using LitJson;
  4. public class JSONDeserializer : MonoBehaviour
  5. {
  6. public TextAsset jsonFile;
  7. void Start()
  8. {
  9. string jsonString = jsonFile.text;
  10. StudentsData data = JsonMapper.ToObject<StudentsData>(jsonString);
  11. List<Student> students = data.students;
  12. // 遍历学生列表并输出信息
  13. foreach (Student student in students)
  14. {
  15. Debug.Log("Name: " + student.name);
  16. Debug.Log("Age: " + student.age);
  17. Debug.Log("Major: " + student.major);
  18. Debug.Log("------------------");
  19. }
  20. }
  21. }
  22. [System.Serializable]
  23. public class StudentsData
  24. {
  25. public List<Student> students;
  26. }
  27. [System.Serializable]
  28. public class Student
  29. {
  30. public string name;
  31. public int age;
  32. public string major;
  33. }

JSON源文件应当放在Resources/Json文件夹下,将上文的脚本挂载到任意物体上即可进行测试,系统会在Console窗口中输出所有道具的信息。

可以看到,直接序列化对象的优点是简单易行,只要定义好了数据类型,就可以直接将JSON转化为方便实用的对象。但缺点也很明显,即JSON对数据类型的要求十分严格。

2、分步获取数据

下面是分布读取JSON信息的例子

  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. using LitJson;
  4. public class JSONDeserializer : MonoBehaviour
  5. {
  6. public TextAsset jsonFile;
  7. void Start()
  8. {
  9. string jsonString = jsonFile.text;
  10. JsonData jsonData = JsonMapper.ToObject(jsonString);
  11. // 读取顶层数据对象
  12. string name = (string)jsonData["name"];
  13. int age = (int)jsonData["age"];
  14. string major = (string)jsonData["major"];
  15. Debug.Log("Name: " + name);
  16. Debug.Log("Age: " + age);
  17. Debug.Log("Major: " + major);
  18. Debug.Log("------------------");
  19. // 读取嵌套对象列表
  20. JsonData studentsData = jsonData["students"];
  21. for (int i = 0; i < studentsData.Count; i++)
  22. {
  23. JsonData studentData = studentsData[i];
  24. string studentName = (string)studentData["name"];
  25. int studentAge = (int)studentData["age"];
  26. string studentMajor = (string)studentData["major"];
  27. Debug.Log("Name: " + studentName);
  28. Debug.Log("Age: " + studentAge);
  29. Debug.Log("Major: " + studentMajor);
  30. Debug.Log("------------------");
  31. }
  32. }
  33. }

这个示例代码假设 JSON 数据文件的顶层结构与上述示例相同。在Start方法中,我们首先将 JSON 字符串解析为JsonData对象,然后逐行读取其中的数据。

首先,我们读取顶层数据对象的姓名、年龄和专业,并打印到日志中。然后,我们读取名为students的嵌套对象列表,使用循环迭代每个学生的数据。在每次迭代中,我们读取学生对象的姓名、年龄和专业,并打印到日志中。

通过这种方式,你可以逐行读取 JSON 数据,并按需处理其中的内容。注意要将 JSON 数据文件分配给jsonFile变量,并确保引入了 LitJson 命名空间。

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

闽ICP备14008679号