所以我一直在寻找将我的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
}
]
}
我还是初学程序员,所以我希望我能在这里提出这样的问题。
答案 0 :(得分:3)
如果你想知道为什么需要一个包装器,那只是因为Unity工程师没有为原始类型或数组添加直接支持。它只是他们如何编程。大多数Json API都不是这样的。
那么它如何填充列表呢?
1 。它会读取您传递给它的json。它检测json中的questions
变量。由于questions
等格式以及用于分隔每个项目的逗号,它会检测到[]
变量是一个数组。
2 。找到questions
变量Question
或Question
列表的类型。
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结构匹配。
这就是我能说的全部,希望你有基本的了解。