包装器如何用于JsonUtility

时间:2017-12-05 11:31:56

标签: c# json unity3d

所以我一直在寻找将我的Json数组转换为Unity中的对象数组。我从一个2年前的老线程中找到了我的解决方案,但没有解释,但我很好奇它是如何工作的 如果我使用Visual Studio查找FromJson的定义,它会告诉我这个 public static T FromJson<T>(string json);
据我所知,FromJson要求填写一个对象,我会给出MyWrapper类,但除了告诉MyWrapper他包含Question列表之外我从不问它在列表中创建新项目。那么它如何填充列表呢?

C#

MyWrapper wrappedQuestions = JsonUtility.FromJson<MyWrapper>(jsonString);

[Serializable]
public class MyWrapper
{
    public List<Question> questions;
}

[Serializable]
public class Question
{
    public int questionType;
    public string questionString;
    public int questionAnswer;
}

的Json

{
    "questions": [
      {
        "questionType":  1,
        "questionString": "4^2",
        "questionAnswer": 16
      },
      {
        "questionType":  2,
        "questionString": "√(25)",
        "questionAnswer": 5
      }
    ]
}

我还是初学程序员,所以我希望我能在这里提出这样的问题。

2 个答案:

答案 0 :(得分:3)

如果你想知道为什么需要一个包装器,那只是因为Unity工程师没有为原始类型或数组添加直接支持。它只是他们如何编程。大多数Json API都不是这样的。

  

那么它如何填充列表呢?

Reflection

1 。它会读取您传递给它的json。它检测json中的questions变量。由于questions等格式以及用于分隔每个项目的逗号,它会检测到[]变量是一个数组。

2 。找到questions变量QuestionQuestion列表的类型。

3 。使用Activator.CreateInstance创建Question的新实例,从json中的每个变量中读取每个值,然后用新实例的反射填充它们它创造了。

<强> 4 即可。它返回已填充的新实例。

如果您阅读并理解如何使用C#中的反射进行基本操作,您可以使用Queue类创建自己的简单Json解析器。

最后,您可以使用this答案中的JsonHelper包装器轻松地序列化/反序列化数组,而无需为每个类创建包装器。

答案 1 :(得分:1)

由于JSON代表Javascript对象表示法,JSON对象(字符串)遵循一种模式。对于要解析并转换为对象的任何字符串,它必须是有效的JSON。它有一定的规则/语法,

例如

[ ]用于数组/列表,

{ }用于对象

并且每个对象都可以包含键值对(由冒号:分隔)以表示变量及其值

{ "Key" : "Value" }

现在JSON解析器知道这些规则,因此它可以检查是否有任何字符串是有效的JSON。

将JSON转换为类对象需要知道什么?

您在此处提供的班级类型:

JsonUtility.FromJson<MyWrapper>(jsonString);

MyWrapper

它应该与jsonString具有相同的结构。

让我们分解你的jsonString,用类结构映射它:

这代表一个MyWrapper对象。它只包含一个名为questions的属性,这是一个空列表。

{                  
    "questions": [ ]
}

如果questions中包含任何元素,它将是Question类型,我们可以在JSON中将其写为以下内容:

{
    "questionType":  1,  // int value
    "questionString": "4^2", // string value
    "questionAnswer": 16 // int value
}

现在如果questions有多个元素,则用逗号分隔:

"questions": [
  {
    "questionType":  1,
    "questionString": "4^2",
    "questionAnswer": 16
  },
  {
    "questionType":  2,
    "questionString": "√(25)",
    "questionAnswer": 4
  },
  ...
]

JSON解析器知道所有这些规则,因此通过查看类结构,它可以解析字符串并创建所声明类的对象,前提是JSON有效且类结构与JSON结构匹配。

这就是我能说的全部,希望你有基本的了解。