gpt4 book ai didi

c# - 包装器如何为 JsonUtility 工作

转载 作者:行者123 更新时间:2023-11-30 20:28:22 25 4
gpt4 key购买 nike

所以我一直在寻找将我的 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
}
]
}

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

最佳答案

如果您想知道为什么需要包装器,那只是因为 Unity 工程师没有添加对基本类型或数组的直接支持。这就是他们编程的方式。大多数 Json API 不是这样的。

So how does it actually fill the list?

Reflection .

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

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

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

4。它返回已填充的新实例。

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

最后,您可以使用来自 thisJsonHelper 包装器轻松回答序列化/反序列化数组,而无需为每个类制作包装器。

关于c# - 包装器如何为 JsonUtility 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47652604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com