You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:34:03