在 C#/.NET 程序中反序列化 Json 的最简单方法是使用出色的 NewtonSoft JSON 库。
有很多方法可以做到这一点,但我不得不承认 NS 库只是继续完成任务(不,我不是团队成员等,只是一个 Avid 用户 :-) )。
做你想做的事,例如,如果你有:
{'Name': 'A person', 'AllowAccess': true,'Areas': ['Sales','Admin']}
您将首先构建一个对象来表示它,如下所示:
public MyObject
{
public string Name { get; set; }
public bool AllowAccess { get; set; }
public List<string> Areas { get; set; }
}
完成此操作后,只需执行以下操作即可:
string jsonString = "// Your json formated string data goes here";
MyObject myObject = JsonConvert.DeserializeObject<MyObject>(jsonString);
此时,您对象中的属性应该反映您发送给它的 JSON 数据中的属性。
您当然需要通过 NuGet 或手动将 NS JSON 库添加到您的项目中,这对您来说更容易,您需要了解的一切都在这里:
How to install JSON.NET using NuGet?
然而,NS JSON 真正的好处不是易于使用,而是它还可以进行动态反序列化。
如果您不知道在收到的 JSON 中会发生什么,因此不知道如何提前构造一个对象来保存结果,这会派上用场。
然而,与其重复其他人所说的,您可以在此堆栈溢出帖子中找到更多关于动态处理的信息:
Deserializing JSON using JSon.NET with dynamic data
更新
查看您的 JSON 数据,您的字段/属性比您尝试解析的要多得多,而且没有一个常用的库(据我所知)会挑选要复制的字段,您要么有一个对象可以代表它们全部,或者根本不代表它们,我认为后者是您面临的问题。
我有一个相当简洁的“JSON”插件用于 chrome,而不是当给定大量 JSON 数据时,它可以很好地为我格式化输出并使其易于阅读,它在定义对象时也有很大帮助,让您可以看到您的数据的完整嵌套结构,这里有一系列图像显示使用此插件格式化的 JSON 数据:
我不打算再粘贴图像了,但要再粘贴 4 页!!
现在,一些额外的信息可能会对您有所帮助。
根据经验(我必须为这些 Jira webhook 编写 PHP 解析器),我知道在 Jira 控制面板中,您可以将 webhook 配置为仅返回您感兴趣的信息。
现在,您似乎刚刚告诉系统转储所有内容,对于您也已上钩的每个事件(看起来 - 全部),我已经有一段时间没有对这些进行任何工作了,但除了全局 webhook 之外,您还拥有单独的 webhook,它们只触发特定事件并生成比您在此处处理的要小得多的 JSON 数据。
因此,我建议您查看您的 Jira 控制面板(或让您的 Admin/Lead Dev/etc 查看)并尽可能多地减少这些数据。
此外,如果我没记错的话,您还可以对 Jira 服务进行各种 Web API 调用以获取此信息,在这种情况下,您可以准确地告诉 API 您感兴趣的内容,这意味着它只会返回您需要的字段。
现在,您的主要问题是您尝试处理的数据量非常庞大,如果您解决了这个问题,您会发现围绕您尝试运行的代码的问题将更容易处理。
更新 2
为了更清楚地说明我使用“动态”类型获取数据的意思,您可以使用类似以下代码的内容:
string jsonString = "// Your json formated string data goes here";
var result = JsonConvert.DeserializeObject<dynamic>(jsonString);
这里的区别在于您使用的是 C# 动态类型,而不是您自己设计的强类型对象。
“动态”很有用,因为它有点像拥有一个空对象,然后为您添加属性,而无需您对其进行定义。
这实质上意味着,如果您传入以下 JSON:
{'Name': 'A person', 'AllowAccess': true,'Areas': ['Sales','Admin']}
你最终会得到一个看起来像这样的动态对象:
result = dynamic
{
public string Name { get; set; }
public bool AllowAccess { get; set; }
public List<string> Areas { get; set; }
}
因此:
result.Name
将让您访问名称字段的内容等等。
如果您的 JSON 被更改为:
{'Name': 'A person', 'AllowAccess': true,'Areas': ['Sales','Admin'], 'Location': 'The World' }
您的对象会神奇地拥有一个名为“Location”的属性,其中包含您可以使用的值“The World”来访问:
result.Location
在您的情况下,这将允许您定义具体对象 EG:
public MyObject
{
public string Name { get; set; }
public string Email { get; set; }
}
然后执行以下操作(假设您的入站 JSON 具有名为 Name & Email 的属性):
string jsonString = "// Your json formated string data goes here";
var result = JsonConvert.DeserializeObject<dynamic>(jsonString);
MyObject myObject = new MyObject
{
Name = result.Name,
Email = result.Email
}
然后您将丢弃不再需要的动态对象。
使用这种方法将遇到的大问题是维护模型。手动属性分配对于少数属性和对象来说都很好,但随着软件的发展,它很快就会成为一个巨大的维护噩梦。
我敢肯定,如果您必须为 100 个不同的 JSON 请求和 50 种不同类型的对象执行此操作,您将面临什么样的任务。
因此,使用这种方法时,您应该考虑使用某种映射技术,例如“AutoMapper”,但是现在我建议您将其留到稍后再开始研究它,因为它会不能帮助您清楚地处理这种动态方法。