【问题标题】:Is there a way to declare and set the variables of a class from json?有没有办法从 json 声明和设置类的变量?
【发布时间】:2020-12-16 08:13:40
【问题描述】:

我正在尝试制作游戏的一部分,其中我必须将 JSON 反序列化为一个类,然后从 UI 中用检索到的类上的数据填充一个表,这样的类看起来像这样:

using System;
[Serializable]
public class Table
{
    public string title;
    public string[] columnHeaders;
    public Data[] data;
}

[Serializable]
public class Data
{
    
}

这是当前的 JSON:

{
    "Title": "Team Members",
    "ColumnHeaders": 
    [
        "Id",
        "Name",
    ],
    "Data": 
    [
        {
            "Id": "0",
            "Name": "John Doe",
        },
        {
            "Id": "1",
            "Name": "Jane Doe",
        },
    ]
}

您会注意到 Data 类是空的,如果我想将数据数组从 JSON 捕获到 class Data,我必须为其声明正确的变量 string Idstring name,但是我希望能够在运行时以动态方式生成这些变量,以便表可以接受任意数量的标题和任何类型的数据结构,这是我的问题/问题,什么方法适合这样的事情?

我一直在阅读一些关于泛型类型、字典、动态对象(还有 ExpandoObjects)、反序列化方法等的文章和 C# 书籍……但到目前为止还没有运气,或者可能不了解如何使用它们正确。

顺便说一句,对于反序列化,我使用的是 JSON.NET,并且我在我的类表中填充了:myTable = JsonConvert.DeserializeObject<Table>(jsonString);,但是是的,数据将为空。在某个时候找到this,听起来至少是我想要发生的事情:

在反序列化动态对象时,序列化程序首先尝试在具有匹配名称的普通 .NET 成员上设置 JSON 属性值。如果没有找到具有属性名称的 .NET 成员,则序列化程序将对动态对象调用 SetMember。

我真的希望有一种方法可以解决这个问题,即使我没有得到我应该做什么的字面答案,也非常感谢指出正确的方向来学习这类事情.谢谢大家的时间。

【问题讨论】:

  • 要走的路是知道你可以期待什么数据,这样你就可以适当地为你的类建模。也许带有 T[] Data 的通用 Table 可以工作。否则,您将不知道要访问哪些(动态或非动态)属性。
  • 也许一个简单的 Dictionary 而不是数据类就足以满足您的用例了吗?一个完全运行时可扩展的数据结构并不简单。
  • @HimBromBeere,这种情况并非如此,columnHeaders 和 Title 都可以工作并从 JSON 中获取正确的数据。
  • @GrimmReaper,是的,最后解决了它。感觉有点傻,因为我实际上尝试了 Data 类中的字典,而不是替换另一个,错过了。谢谢!

标签: c# json unity3d


【解决方案1】:

您可以将空的Data 类替换为Dictionary<string, string>(或Dictionary<string, object>)。 JSON.net 会处理这个问题。

所以有了这个Table

[Serializable]
public class Table
{
    public string title;
    public string[] columnHeaders;
    public Dictionary<string, string>[] data;
}

您可以像这样访问您的data

var id = tableInstance.data[0]["Id"];
var name = tableInstance.data[0]["Name"];

tableInstance.data[0].Add("Age", "21");

【讨论】:

  • 所以我不得不用字典替换整个类......这真的很有帮助,不知道它会自动填充。非常感谢,它完美地解决了我的问题并教会了我一些新东西,感谢您的实际演示。
猜你喜欢
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 2010-10-14
相关资源
最近更新 更多