C#、Unity3D、JSON 解析:无法将 JSON 解析为 C# 对象

2024-02-28

我一直在使用统一引擎构建英语游戏。我正在努力让 C# 解析 JSON。

最近几天我一直在尝试解析 JSON,但没有成功。我已经验证了 JSON,可以将 jsonString 调试到控制台,但是一旦 jsonUtility 拿到了 json,我就会得到一堆 NULL 数据。

这是我的 json:

 {"question": {"questionType": "0", "categoryID": "0", "bonusBool": "FALSE", "answerText": "cake", "questionText": "If something is really easy to do, it\u2019s a piece of \u2026\u2026\u2026 \\n a. pie \\n b. tart \\n c. cake", "ID": "0"}}

这是我的 C#:

 [System.Serializable]
 public class QuestionDataAsString
 {

     public string questionText;
     public string answerText;
     public string categoryID;
     public string ID;
     public string questionType;
     public string bonusBool;

 }

 [System.Serializable]
 public class Question{

     public string questionText;
     public string answerText;
     public int categoryID;
     public int ID;
     public int questionType;
     public bool bonusBool;

 }

 public static void LoadQuestion()
     {
         string filePath = Path.Combine(Application.streamingAssetsPath, "questionData.json");
         string dataAsJSON = File.ReadAllText(filePath);
         Debug.Log(dataAsJSON);
         QuestionDataAsString question = JsonUtility.FromJson<QuestionDataAsString>(dataAsJSON);
         Debug.Log(question.questionText);
     }

 public static Question ConvertQuestionDataFromString(QuestionDataAsString stringData)
     {
         Question question = new Question();
         question.questionText = stringData.questionText;
         question.answerText = stringData.answerText;
         question.categoryID = int.Parse(stringData.categoryID);
         question.ID = int.Parse(stringData.ID);
         question.questionType = int.Parse(stringData.questionType);
         question.bonusBool = Boolean.Parse(stringData.bonusBool);
         return question;
     }

当我通过闪屏控制器运行 LoadQuestion 时,我可以将 json 作为字符串记录到控制台。但是一旦我使用 jsonUtility,我就会得到 Null 对象。

这是控制台输出:

 {"question": {"questionType": "0", "categoryID": "0", "bonusBool": "FALSE", "answerText": "cake", "questionText": "If something is really easy to do, it\u2019s a piece of \u2026\u2026\u2026 \\n a. pie \\n b. tart \\n c. cake", "ID": "0"}}
 UnityEngine.Debug:Log(Object)
 SaveLoadManager:LoadQuestion() (at Assets/Scripts/SaveLoadManager.cs:91)
 <Start>c__Iterator0:MoveNext() (at Assets/Scripts/SplashController.cs:18)
 UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

 Null
 UnityEngine.Debug:Log(Object)
 SaveLoadManager:LoadQuestion() (at Assets/Scripts/SaveLoadManager.cs:93)
 <Start>c__Iterator0:MoveNext() (at Assets/Scripts/SplashController.cs:18)
 UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

我已经搜索了这里的答案和统一答案,但没有找到任何相关的解决方案。

知道为什么 fromJson 为所有内容返回 Null 吗?


您的 JSON 与您的 C# 类结构不匹配。您需要一个根级别对象来保存问题详细信息。另外,您应该使用属性,而不是字段。例如:

public class QuestionRoot
{
    public Question Question { get; set; }
}

public class Question
{
    public string questionType { get; set; }
    public string categoryID { get; set; }
    public string bonusBool { get; set; }
    public string answerText { get; set; }
    public string questionText { get; set; }
    public string ID { get; set; }
}

现在你可以这样做:

var questionRoot = JsonUtility.FromJson<QuestionRoot>(dataAsJSON);
var questionText = questionRoot.question.questionText;

旁注:您应该考虑遵循 C# 命名惯例。属性几乎总是以大写字母开头:

public string QuestionText { get; set; }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#、Unity3D、JSON 解析:无法将 JSON 解析为 C# 对象 的相关文章

随机推荐