Получить данные JSON в Unity (2D Array) - PullRequest
1 голос
/ 12 июня 2019

Я очень новичок в Unity и C #.Я пытаюсь загрузить JSON-строку в Unity, и все работает как положено, но когда я хочу загрузить 2D-массив, он не работает вообще.

У меня есть либо это ...

{
    "status": 0, 
    "email": "exmpl@u", 
    "questions": [
        {
            "A": "Faro", 
            "C": "Oporto", 
            "B": "Lisbon", 
            "D": "Coimbra", 
            "question": "Which is the capital of Portugal?", 
            "your_answer": "", 
            "points": 10, 
            "correct_answer": "B"
        }, 
        {
            "A": "Seville", 
            "C": "Madrid", 
            "B": "Barcelona", 
            "D": "C\u00e1ceres", 
            "question": "Which is the capital of Spain?", 
            "your_answer": "", 
            "points": 15, 
            "correct_answer": "C"
        }, 
        {
            "A": "Gigon", 
            "C": "Cannes", 
            "B": "Marselle", 
            "D": "Paris", 
            "question": "Which is the capital of France?", 
            "your_answer": "", 
            "points": 20, 
            "correct_answer": "D"
        }
    ]
}

... или эта строка

{
    "status": 0, 
    "email": "exmpl@u", 
    "questions": [
        {
            "A": "Marcelo Rebelo de Sousa", 
            "C": "M\u00e1rio Soares", 
            "B": "Anibal Cavaco Silva", 
            "D": "Jorge Sampaio", 
            "question": "Which is the president of Portugal?",
            "your_answer": "", 
            "points": 10, 
            "correct_answer": "A"
        }, 
        {
            "A": "Fran\u00e7ois Miterrand", 
            "C": "Jacques Chirac", 
            "B": "Emmanuel Macron", 
            "D": "Nicolas Sarkozy", 
            "question": "Which is the president of France?", 
            "your_answer": "", 
            "points": 15, 
            "correct_answer": "B"
        }
    ]
}

я создал класс QuizData для сохранения всех объектов в нем, похожий на этот

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace QuizDataManager
{
    public class QuizData
    {
        public int status;
        public string email;
        public string[] questions;
    }
}

я могу получить доступстатус переменных и электронная почта легко myQuizDataObject.status или myQuizDataObject.email, но я ничего не получаю с myQuizDataObject.questions [0] или чем-то подобным.

Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Мы не видим, как именно вы анализируете эту строку JSON в экземпляре QuizData, но я предполагаю, что вы используете JsonUtility.

Ваша структура данных c #не представляет структуру, которую вы получаете.Классный инструмент для простого создания ac # макета существующей строки Json: json2csharp .Только для Unity убедитесь, что удалили все добавленные {get; set;}, которые создают свойства вместо полей, которые (не) не сериализуются с использованием JsonUtility.

Это было бы что-то вроде

[Serializable]
public class QuizData
{
    public int status;
    public string email;
    public Question[] questions;
}

[Serializable]
public class Question
{
    public string A;
    public string C;
    public string B;
    public string D;

    public string question;
    public string your_amswer;
    public int points;
    public string correct_answer;
}

Тогда вы просто получите доступ, например:

var myQuizDataObject = JsonUtility.FromJson<QuizData>(theJsonString);

var firstQuestion = myQuizDataObject.questions[0].question;
var answerA = myQuizDataObject.questions[0].A;
...

В зависимости от ваших потребностей вместо string вы также можете получить правильное перечисление для correct_answer и your_answer, например

public enum AnswerOption
{
    None,
    A,
    B,
    C,
    D
}

[Serializable]
public class Question
{
    public string A;
    public string C;
    public string B;
    public string D;

    public string question;
    public AnswerOption your_amswer;
    public int points;
    public AnswerOption correct_answer;
}

и может даже автоматически заполнить словарь им, как это было предложено в другом ответе, например, реализовать интерфейс ISerializationCallbackReceiver

[Serializable]
public class Question : ISerializationCallbackReceiver
{
    public readonly Dictionary<AnswerOption, string>() answers;

    public string A;
    public string C;
    public string B;
    public string D;

    public string question;
    public AnswerOption your_amswer;
    public int points;
    public AnswerOption correct_answer;

    public void OnBeforeSerialize()
    {
        // do nothing but required by the interface
    }

    public void OnAfterDeserialize()
    {
        answers = new Dictionary<AnswerOption, string>(4);

        _myDictionary.Add(AnswerOption.A, A);
        _myDictionary.Add(AnswerOption.B, B);
        _myDictionary.Add(AnswerOption.C, C);
        _myDictionary.Add(AnswerOption.D, D);
    }
}
1 голос
/ 12 июня 2019

Я думаю, что myQuizDataObject.questions[0][A] (Guessing) получит результат, вы можете увидеть такие данные, как "A": "Faro", который является ключом и значением. Но ваши данные не имеют особого смысла. Где ты это взял?

Это может быть массив Dictionary<string, string>

Это , кажется, то, что вам нужно для вопросов

{
    "status": 0, 
    "email": "exmpl@u", 
    "questions": [{
        "A": "Marcelo Rebelo de Sousa", 
        "C": "M\u00e1rio Soares", 
        "B": "Anibal Cavaco Silva", 
        "D": "Jorge Sampaio", 
        "question": "Which is the president of Portugal?", 
        "your_answer": "", 
        "points": 10, 
        "correct_answer": "A"
    }, {
        "A": "Fran\u00e7ois Miterrand", 
        "C": "Jacques Chirac", 
        "B": "Emmanuel Macron", 
        "D": "Nicolas Sarkozy", 
        "question": "Which is the president of France?", 
        "your_answer": "", 
        "points": 15, 
        "correct_answer": "B"
    }]
}
...