2017-09-25 21 views
1

私は、ユニティエンジンを使用して英語のゲームを構築しています。私は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) 

私はここで答えを通って、団結回答で検索しましたが、関連するすべてのソリューションを発見していません。

fromJsonがNullをすべて返す理由は何ですか?

+1

JSONがC#クラスの構造と一致しません。 – DavidG

+0

そのJSONクラスを使用して幸運を祈る、それは単一性ではありませんJSONの脱石化7つのネストされたレベル –

+1

@ johnny5何が問題なのですか?これはわずか2レベルです。 – DavidG

答えて

2

JSONがC#クラスの構造と一致しません。質問の詳細を保持するには、ルートレベルのオブジェクトが必要です。また、フィールドではなくプロパティを使用する必要があります。たとえば:

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

サイドノート:

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; } 
} 

今、あなたはこれを行うことができますあなたの命名のためのC#の一般的な方法を以下の点を考慮すべきです。プロパティはほとんど常に大文字で始まります。

public string QuestionText { get; set; } 
+0

エンジンではプロパティが処理されるだけでなく、処理されるため、これはUnityでは機能しない可能性があります。しかし、ルートオブジェクトに関する部分は有効です。 –

+0

@ViktorSeifert興味深い点です(私はUnityユーザではありません!) – DavidG

+0

ありがとう、明日このソリューションを試してみましょう!私はPythonから来ています、これは私の最初のC#プロジェクトなので、私はまだすべての規約を知っていません。 Viktorが言及したように、私はUnityとプロパティに関する多くの問題を読んできました。余分な問題がある場合は、フィールドにプロパティを使用する利点を説明できますか? – Era