Unity C#:将JSON文件解析为数据结构

时间:2018-02-04 15:53:50

标签: c# json parsing unity3d unity5

我尝试在Unity C#中创建自定义修订测验程序,该程序允许用户使用JSON文件将问题加载到程序中,结构如下:

{
  "question": [
    {
      "title": "What wave characteristic is measured on the vertical axis?",
      "answers": {
        "correct": "Amplitude",
        "wrong": [
          "Frequency",
          "Period",
          "Speed"
        ]
      }
    },
    {
      "title": "Which of these is a vector quantity?",
      "answers": {
        "correct": "Velocity",
        "wrong": [
          "Speed",
          "Time",
          "Mass"
        ]
      }
    }
  ]
}

我设法使用StreamReader从文件中读取程序,但是在尝试将其放入单个数据结构时遇到了很多麻烦。

我已经看过其他解决方案使用类并为他们的解决方案手动定义结构,但我不知道如何实现这一点a)复杂的结构和b)一个结构可以有一个其中的项目数量(我希望支持任何数量的问题)。如果最好的方法是定义这些类,我该如何引用其中的项?在过去,我使用Python 3.6的jsonjson.loads()函数解析了JSON,并且工作得很好,创建了一个单维的多维数组/字典结构可以很容易地工作。

简单来说,我目前有一个字符串,我已从其中包含JSON数据的文件中读取。我如何将其合成为一个我可以轻松访问的数组,例如questions[question][0]["title"],在上述情况下会返回"What wave characteristic is measured on the vertical axis?"

2 个答案:

答案 0 :(得分:1)

使用this site生成您的模型。

    public class Answers
{
    public string correct { get; set; }
    public List<string> wrong { get; set; }
}

public class Question
{
    public string title { get; set; }
    public Answers answers { get; set; }
}

public class RootObject
{
    public List<Question> question { get; set; }
}
var model = JsonConvert.DeserializeObject<RootObject>(jsonstring);

这就是全部

BTW:您还可以动态访问这些属性,而无需声明任何模型

var model = JObject.Parse(jsonstring);
var title0 = (string)model["question"][0]["title"];

PS:我使用了Json.net

答案 1 :(得分:0)

我认为使用上面给出的JSON在应用程序中创建单个数据结构的一种方法是使用&#34;粘贴特殊功能&#34;视觉工作室。一旦从编辑菜单中选择它,您可以选择通过粘贴任何有效的JSON从JSON创建类。 enter image description here

在粘贴与问题相关的JSON后,我得到以下课程: -

public class Rootobject
{
public Question[] question { get; set; }
}

public class Question
{
public string title { get; set; }
public Answers answers { get; set; }
}

public class Answers
{
public string correct { get; set; }
public string[] wrong { get; set; }
}

单个Rootobject类由Question数组组成。可视工作室自动创建与问题和答案相关的不同类。

您可以使用JSON.NET desrialization将JSON值反序列化到RootObject中:

var questions= JsonConvert.DeserializeObject<RootObject>(jsonString);