【发布时间】: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 Id 和 string 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 类中的字典,而不是替换另一个,错过了。谢谢!