Unity C#自定义复习测验程序:JSON文件解析至数据结构问题
嘿,我来帮你搞定这个JSON解析的问题!其实核心就是让你的C#类结构完全匹配JSON的层级,不管结构多复杂,照着这个思路来就顺了,我给你一步步拆解:
解决Unity C#中JSON试题解析的问题
第一步:先明确你的JSON试题结构
先拿一个典型的复杂试题JSON举例子,你可以对照自己的JSON调整:
{ "quizName": "C#基础复习题", "totalQuestions": 3, "questions": [ { "id": 1, "questionText": "以下哪个是值类型?", "options": ["string", "int", "object", "List<int>"], "correctAnswerIndex": 1, "difficulty": "Easy", "tags": ["基础", "类型系统"] }, { "id": 2, "questionText": "Unity中Update方法的调用频率是?", "options": ["固定0.02秒", "与帧率同步", "每帧调用一次", "每秒30次"], "correctAnswerIndex": 2, "difficulty": "Medium", "tags": ["Unity", "生命周期"] } ] }
第二步:定义匹配的C#类/结构体
关键点是字段名和JSON的键完全对应,还要给类加上[System.Serializable]特性(Unity自带的JsonUtility必须要这个):
// 整个测验的根类 [System.Serializable] public class QuizData { public string quizName; public int totalQuestions; public List<Question> questions; // 嵌套的试题列表 } // 单个试题的类 [System.Serializable] public class Question { public int id; public string questionText; public List<string> options; // 选项数组 public int correctAnswerIndex; public string difficulty; public List<string> tags; // 标签数组 }
要是你的JSON里有可选字段(不是每个试题都有),可以把字段默认值设为
null,比如public string hint = null;,这样解析时不会因为缺少字段报错。
第三步:把JSON字符串解析成类实例
这里给你两种常用方法,根据你的需求选:
方法1:用Unity自带的JsonUtility(推荐,无需额外包)
结合你已经在用的StreamReader,直接解析就行:
using System.IO; using UnityEngine; public class QuizLoader : MonoBehaviour { public void LoadQuiz(string filePath) { // 读取JSON内容 string jsonContent = ""; using (StreamReader reader = new StreamReader(filePath)) { jsonContent = reader.ReadToEnd(); } // 解析成QuizData对象 QuizData quiz = JsonUtility.FromJson<QuizData>(jsonContent); // 现在就能直接用数据啦,比如遍历试题 foreach (var question in quiz.questions) { Debug.Log($"试题{question.id}: {question.questionText}"); } } }
方法2:用Newtonsoft.Json(处理多态/更复杂结构)
如果你的试题有多种类型(比如选择题、填空题、判断题),Unity自带的工具处理多态会有点麻烦,这时候可以用Newtonsoft.Json(在Unity Package Manager里搜一下就能导入)。
比如先定义试题基类和子类:
public abstract class BaseQuestion { public int id; public string questionText; public string difficulty; } public class ChoiceQuestion : BaseQuestion { public List<string> options; public int correctAnswerIndex; } public class FillBlankQuestion : BaseQuestion { public string correctAnswer; }
然后解析时开启类型识别:
using Newtonsoft.Json; using System.IO; public void LoadQuizWithPolymorphism(string filePath) { string jsonContent = File.ReadAllText(filePath); var quiz = JsonConvert.DeserializeObject<QuizData>(jsonContent, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto // 自动识别子类类型 }); }
用这个方法时,JSON里会自动带上类型信息,或者你也可以自定义转换器来适配不同格式。
常见坑点排查
- 解析后字段为null?检查类的字段名和JSON键是否完全一致,有没有加
[System.Serializable]特性。 - 嵌套列表解析失败?确保列表的泛型类型也加了
[System.Serializable](比如上面的Question类)。 - 用户导入的JSON格式有小差异?可以在解析前做简单的字符串替换,或者用Newtonsoft的自定义转换器来适配。
这样你就能把任意复杂的JSON试题解析成统一的C#数据结构,后续做试题展示、成绩统计都轻松啦!
内容的提问来源于stack exchange,提问作者barnstorm3r
相关产品推荐
相关产品推荐

