Unity3D_使用JsonUtility读取Json
使用Unity内置的方法对json进行写入与读取,不依赖任何插件和dll
使用到的API
读取:
JsonUtility.FromJson<T>(string json)
JsonUtility.FromJsonOverwrite(string json, object objectToOverwrite)
写入:
JsonUtility.ToJson(object obj)
____________________________________________________
以“答题”作为示例讲解 json 的读取与写入
一、首先我们需要创建一个“答题” 的类,该类包括:题目、选项(A、B、C、D)、答案
// 一个完整的“问题”类(注意:一定要序列化,不序列化读不出来,序列化的意思就是:在创建类的上一行加上[Serializable]) [Serializable] public class AloneQuestion { public string title; public string A; public string B; public string C; public string D; public string answer; }
二、上面的类只代表一道题,实际应用中我们可能有很多题,所以我们需要创建一个“题库”类
// “题库”类的变量,就是“问题”类的数组(注意:一定要序列化,不序列化读不出来) [Serializable] public class AllQuestion { public AloneQuestion[] questions;
三、类创建完了,那么怎么写与类对应的 json 呢
建议使用 Visual Studio 编辑写json文件,
在使用 Visual Studio 编辑 json 文件的时候编辑器指出json文件编辑时的错误,
省去了去网站校验 json 的步骤,但是仍在此提供一个校验 json 的网站 JSON在线校验格式化工具(Be JSON)
注意:json中不能用双斜杠(//)注释,否则在读取的时候会报错
____________________________________________________
完整代码:
using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; public class WiWi_JsonUsage : MonoBehaviour { // Update is called once per frame void Update() { // 按 W 写入json,按 R 读取json并打印到控制台 if (Input.GetKeyDown(KeyCode.W)) { WriteJson(); } else if (Input.GetKeyDown(KeyCode.R)) { ReadJson01(); } else if (Input.GetKeyDown(KeyCode.Space)) { ReadJson02(); } } // 读取 json (方法一) private void ReadJson01() { AllQuestion allq = new AllQuestion(); // Json 文件的路径 string path = File.ReadAllText(Application.streamingAssetsPath + "/Question.json"); // 文件内容存到本地 allq = JsonUtility.FromJson<AllQuestion>(path); // 将读取的内容打印到控制台 string str = "Json 文件读取成功,内容如下:\n\n"; for (int i = 0; i < allq.questions.Length; i++) { str += "问题:" + allq.questions[i].title + "\n"; str += "A、" + allq.questions[i].A + "\n"; str += "B、" + allq.questions[i].B + "\n"; str += "C、" + allq.questions[i].C + "\n"; str += "D、" + allq.questions[i].D + "\n"; str += "答案:" + allq.questions[i].answer + "\n\n"; } print(str); } // 读取 json (方法二) public AloneQuestion[] questions; private void ReadJson02() { // 获取json文件中所有的文字(json文件需要是 UTF8 编码) string data = File.ReadAllText(Application.streamingAssetsPath + "/Question.json", System.Text.Encoding.UTF8); // 将文字转换为本类中的字段 JsonUtility.FromJsonOverwrite(data, this); // 将读取的内容打印到控制台 string str = "Json 文件读取成功,内容如下:\n\n"; for (int i = 0; i < questions.Length; i++) { str += "问题:" + questions[i].title + "\n"; str += "A、" + questions[i].A + "\n"; str += "B、" + questions[i].B + "\n"; str += "C、" + questions[i].C + "\n"; str += "D、" + questions[i].D + "\n"; str += "答案:" + questions[i].answer + "\n\n"; } print(str); } // 写入 json private void WriteJson() { // 创建第一个问题 AloneQuestion aq1 = new AloneQuestion(); // 为问题中的每个变量赋值 aq1.title = "《滕王阁序》是谁写的"; aq1.A = "李白"; aq1.B = "杜甫"; aq1.C = "陈世美"; aq1.D = "西门庆"; aq1.answer = "A"; // 创建第二个问题 AloneQuestion aq2 = new AloneQuestion(); // 为问题中的每个变量赋值 aq2.title = "请选出《西游记》中的主要人物"; aq2.A = "吴承恩"; aq2.B = "罗贯中"; aq2.C = "张无忌"; aq2.D = "郭富城"; aq2.answer = "C"; // 将所有问题添加“合集”中 AllQuestion allQ = new AllQuestion(); allQ.questions = new AloneQuestion[2]; allQ.questions[0] = aq1; allQ.questions[1] = aq2; // 将数据转换为 json 格式 string str = JsonUtility.ToJson(allQ);
// 如果路径不存在就生成路径 if (!Directory.Exists(Application.streamingAssetsPath)) { Directory.CreateDirectory(Application.streamingAssetsPath); } // json 数据要存储的路径 string path = Application.streamingAssetsPath + "/Question.json"; // 保存 json 文件 File.WriteAllText(path, str); print("Json 文件写入成功"); } } // 所有“问题”的合集(注意:一定要序列化,不序列化读不出来) [Serializable] public class AllQuestion { public AloneQuestion[] questions; } // 一个完整的“问题”类(注意:一定要序列化,不序列化读不出来) [Serializable] public class AloneQuestion { public string title; public string A; public string B; public string C; public string D; public string answer; }
完整的 json(如果下载了unityPackage 该 json 会自动生成)
{ "questions":[ { "title":"《滕王阁序》是谁写的", "A":"李白", "B":"杜甫", "C":"陈世美", "D":"西门庆", "answer":"A" }, { "title":"请选出《西游记》中的主要人物", "A":"吴承恩", "B":"罗贯中", "C":"张无忌", "D":"郭富城", "answer":"C" } ] }
最后:提供一个 UnityPackage 供测试使用(点击下载)
UnityPackage操作说明:
W:生成 Json 文件;
R:使用方法一,读取 Json 并打印到控制台;
空格:使用方法二,读取 Json 并打印到控制台;