C# 包装器如何为JsonUtility工作
所以我一直在寻找将Json数组转换为Unity中的对象数组。我从一个2年前的线程中找到了我的解决方案,没有任何解释,但我很好奇它到底是如何工作的。C# 包装器如何为JsonUtility工作,c#,json,unity3d,C#,Json,Unity3d,所以我一直在寻找将Json数组转换为Unity中的对象数组。我从一个2年前的线程中找到了我的解决方案,没有任何解释,但我很好奇它到底是如何工作的。 如果我使用Visual Studio从JSON中查找的定义,它会显示这一点 publicstatict-FromJson(字符串json) 据我所知,FromJson要求填充一个对象,我给类MyWrapper,但除了告诉MyWrapper他包含一个问题的列表之外,我从未要求它在列表中创建一个新项。那么,它究竟是如何填满这个列表的呢 C# 我还是一个初
如果我使用Visual Studio从JSON中查找
的定义,它会显示这一点
publicstatict-FromJson(字符串json)代码>
据我所知,FromJson
要求填充一个对象,我给类MyWrapper
,但除了告诉MyWrapper
他包含一个问题的列表之外,我从未要求它在列表中创建一个新项。那么,它究竟是如何填满这个列表的呢
C#
我还是一个初学者,所以我希望我能在这里问这样的问题。因为JSON
代表Javascript对象表示法,JSON对象(字符串)遵循一种模式。对于任何要解析并转换为对象的字符串,它必须是有效的JSON。它有一定的规则/语法
比如说
[]
用于数组/列表
{}
用于对象
每个对象都可以包含键值对(用冒号分隔):
)来表示变量及其值
{ "Key" : "Value" }
现在JSON解析器知道这些规则,所以它可以检查任何字符串是否是有效的JSON
将JSON转换为类对象需要知道什么
您在此处提供的类类型:
JsonUtility.FromJson<MyWrapper>(jsonString);
如果questions
中有任何元素,那么它将是Question
类型,我们可以用JSON编写如下内容:
{
"questionType": 1, // int value
"questionString": "4^2", // string value
"questionAnswer": 16 // int value
}
现在,如果问题
有多个元素,它们将用逗号分隔:
"questions": [
{
"questionType": 1,
"questionString": "4^2",
"questionAnswer": 16
},
{
"questionType": 2,
"questionString": "√(25)",
"questionAnswer": 4
},
...
]
JSON解析器知道所有这些规则,因此通过查看类结构,它可以解析字符串并创建所述类的对象,前提是JSON有效且类结构与JSON结构匹配
关于这一点,我只能说这些了,希望你能有基本的理解。如果你想知道为什么需要一个包装器,那只是因为Unity工程师没有添加对基本类型或数组的直接支持。这只是他们编程的方式。大多数Json API不是这样的
那么,它究竟是如何填满这个列表的呢
1。它读取您传递给它的json。它检测json中的questions
变量。它检测到questions
变量是一个数组,其格式为[]
以及分隔每个项目的逗号
2。它查找questions
变量的类型,该变量是Question
或Question
列表
3。它用于创建问题的新实例,读取json中每个变量的每个值,然后用它创建的新实例的反射填充它们
4。它返回已填充的新实例
如果您阅读并理解了如何在C#中使用反射进行基本操作,那么您可能能够使用Queue
类创建自己的简单Json解析器
最后,您可以使用answer中的JsonHelper
包装器轻松地序列化/反序列化数组,而无需为每个类制作包装器。。那么,它究竟是如何填满这个列表的呢?它是一个解析器,解析器就是这么做的?你的问题不清楚
{
"questions": [ ]
}
{
"questionType": 1, // int value
"questionString": "4^2", // string value
"questionAnswer": 16 // int value
}
"questions": [
{
"questionType": 1,
"questionString": "4^2",
"questionAnswer": 16
},
{
"questionType": 2,
"questionString": "√(25)",
"questionAnswer": 4
},
...
]