2017-09-25 234 views
1

我一直在使用Unity引擎來構建英語語言遊戲。我正在努力讓C#解析JSON。C#,Unity3D,JSON解析:無法解析JSON到C#對象

我一直在試圖讓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) 

我經過這裏的答案,團結回答搜查,但沒有發現任何相關的解決方案。

任何想法爲什麼從json迴歸零?

+1

您的JSON不符合您的C#類結構。 – DavidG

+0

祝你好運使用該JSON類,因爲該統一不會Deseralize JSON低於7嵌套級別 –

+1

@ johnny5有什麼問題?這隻有2個級別。 – DavidG

回答

2

您的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; } 
+0

這可能無法在Unity中工作,因爲引擎不能處理屬性以及它應該。但是關於根對象的部分是有效的。 –

+0

@ViktorSeifert這是一個有趣的觀點(我不是Unity用戶!) – DavidG

+0

謝謝,明天我會試試這個解決方案!我來自python,這是我的第一個C#項目,所以我還不知道所有的約定。正如Viktor提到的,我已經閱讀了Unity和屬性的許多問題。如果你有空餘的時間,不考慮統一的具體問題,你能否解釋使用屬性而不是字段的好處? – Era