Я новичок в 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] или чем-то подобным.
Как я могу это сделать?
@MilanKarman Я не понимаю класс с двумя строками, но я создал класс со строкой для «A», «B», «C», «D», «вопрос» и т. д. и поместил строку общедоступные вопросы[] вопросы = новые вопросы[3]; в моем классе QuizData и попытался получить к нему доступ с помощью myQuizDataObject.questions[0].A, что все еще не работает. Unity говорит: «NullReferenceException: объект не установлен в экземпляр объекта»
Похоже, это должно сработать. Если вы используете встроенный в Unity анализатор JSON, попробуйте вместо этого использовать что-то вроде newtonsoft.com/json. Я всегда обнаруживал, что парсер Unity JSON ведет себя странно.
Я думаю, что 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"
}]
}
Данные JSON предоставлены моим профессором, и я не могу их изменить. myQuizDataObject.questions[0][A] не работает. Могу ли я что-то изменить в своем классе QuizData?
Мы не видим, как именно вы анализируете эту строку JSON в экземпляре QuizData
, но я предполагаю, что вы используете JsonUtility
.
Ваша структура данных С# не представляет структуру, которую вы получаете. json2csharp — отличный инструмент для простого создания макета C# существующей строки Json. Только для 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);
}
}
мило спасибо! Мне просто нужно было добавить [Serializable]. Не знал этого!
Привет, проблема может быть в том, что у вас есть массив строк, определенный для вопросов, но файл JSON содержит объекты с двумя строками. Возможно, попробуйте создать другой класс с именем, который содержит две строки, и вместо этого создайте массив?