【问题标题】:How does a wrapper work for JsonUtility包装器如何为 JsonUtility 工作
【发布时间】:2018-05-19 01:18:08
【问题描述】:

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

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

【问题讨论】:

  • Maybe read the docs?那么它实际上是如何填充列表的呢? 它是一个解析器,这就是解析器的作用?你的问题不清楚

标签: c# json unity3d


【解决方案1】:

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

那么它实际上是如何填充列表的呢?

Reflection.

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    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 结构匹配。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多