【问题标题】:Get JSON Data in Unity (2D Array)在 Unity 中获取 JSON 数据(二维数组)
【发布时间】:2019-06-12 04:59:40
【问题描述】:

我对 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] 或类似的东西。

我该怎么做?

【问题讨论】:

  • 您好,问题可能是因为您为问题定义了一个字符串数组,但 JSON 文件包含具有两个字符串的对象。也许尝试创建另一个名为的类,它包含两个字符串,然后创建一个数组?
  • @MilanKarman 我不知道有两个字符串的类,但我创建了一个带有“A”、“B”、“C”、“D”、“问题”的字符串的类" 以此类推,然后将行 public Questions[] questions = new Questions[3];在我的 QuizData 类中并尝试使用 myQuizDataObject.questions[0].A 访问它,但仍然无法正常工作。 Unity 说“NullReferenceException: Object not set to an instance of an Object”
  • 听起来应该可以。如果您使用 Unity 的内置 JSON 解析器,请尝试使用 newtonsoft.com/json 之类的东西。我总是发现 Unity 的 JSON 解析器表现得很奇怪

标签: c# json unity3d vuforia


【解决方案1】:

我们不知道您是如何将 JSON 字符串解析为 QuizData 实例的,但我假设您使用的是 JsonUtility

您的 c# 数据结构并不代表您得到的结构。 json2csharp 是一个很酷的工具,可以简单地生成现有 Json 字符串的 c# 布局。仅适用于 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_answeryour_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 interface

[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]。不知道!
【解决方案2】:

我认为myQuizDataObject.questions[0][A] (Guessing) 会得到一个结果,你可以看到像"A": "Faro" 这样的数据的配对,它是键和值。但是您的数据没有多大意义。你从哪里弄来的?

可能是Dictionary&lt;string, string&gt;的数组

This 似乎是你所需要的问题

{
    "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 类改变一些东西吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 2015-05-22
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多