C# 包装器如何为JsonUtility工作

C# 包装器如何为JsonUtility工作,c#,json,unity3d,C#,Json,Unity3d,所以我一直在寻找将Json数组转换为Unity中的对象数组。我从一个2年前的线程中找到了我的解决方案,没有任何解释,但我很好奇它到底是如何工作的。 如果我使用Visual Studio从JSON中查找的定义,它会显示这一点 publicstatict-FromJson(字符串json) 据我所知,FromJson要求填充一个对象,我给类MyWrapper,但除了告诉MyWrapper他包含一个问题的列表之外,我从未要求它在列表中创建一个新项。那么,它究竟是如何填满这个列表的呢 C# 我还是一个初

所以我一直在寻找将Json数组转换为Unity中的对象数组。我从一个2年前的线程中找到了我的解决方案,没有任何解释,但我很好奇它到底是如何工作的。
如果我使用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
  },
  ...
]