如何处理常见的JSON嵌套结构

如何处理常见的JSON嵌套结构,第1张

我们继续之前的话题。很多时候,服务器返回的JSON都不是一个“扁平”的结构,而是包含了各种嵌套,在这一节,我们就来处理如何把各种嵌套的情况,对应到Swift model。

第一种情况,是用对象封装数组,例如,服务器返回了多个视频信息的JSON:

为了把类似这种情况的JSON直接转型成model,我们只要定义下面这样的 struct 就好了:

这里,由于 EpisodeList 和 Episode 都是遵从 Codable 的,因此我们可以直接用之前的方式对JSON解码:

只是这次,对应的Model类型,变成了 EpisodeList 。执行一下,就能在控制台看到下面这样的结果:

第二种情况,服务器还可能直接返回一个数组,而不使用对象封装它:

对这种情况,我们无须声明任何新的类型,只要在解码的时候,指定一个数组类型就好了:

这次,我们就会看到这样的结果:

第三种情况,可以看成是前面两种情况的组合,假设数组中的对象,是通过一个Key索引的:

对于这种情况,数组内的结构,可以用 Dictionary<String: Episode> 表示,而整个JSON,则是这种 Dictionary 的数组,于是,在解码的时候,我们只要把这个类型传递给它就好了:

执行下,就会看到这样的结果:

在这一节最后,我们结合之前说过的这些情况,看一个更一般的例子,假设我们要给视频播放的页面传递一个包含所有要显示内容的JSON,它看上去是这样的:

为了把这段JSON自动转型成Swift model,我们新建一个 struct :

它对应JSON头部视频信息的部分,这里,由于视频难度属于视频信息的一部分,我们把 EpisodeLevel 定义成了一个内嵌类型。

接下来,JSON的后半段,是系列中每一个视频的具体信息,这种情况我们已经处理过了,这里,我们把之前定义的类型整理一下:

可以看到,我们把 EpisodeType 也变成了 Episode 的内嵌类型。最后,我们定义一个表示页面数据的 struct :

这样, EpisodePage 就完全对应我们上面提到的JSON结构了,接下来,使用用 decode 方法解码就好:

执行一下,就能看到下面这样的结果了:

代码:请导入 SystemXML命名空间
string file = ServerMapPath(@"~\webconfig");
XmlDocument xmlDoc = new XmlDocument();
xmlDocLoad(file);
string s1 = "aaa";
string s2 = "bbb";
string h = "ccc";
string user = "ddd";
string pass = "eee";
XmlNodeList nodeList = null;
nodeList = xmlDocSelectSingleNode("configuration//connectionStrings")ChildNodes;
//遍历所节点
foreach (XmlNode xn in nodeList)
{
//节点类型转换XmlElement类型
XmlElement xe = xn as XmlElement;
if (xeName == "add")
{
if (xeGetAttribute("name") == "acountConnectionString")
{
xeSetAttribute("connectionString", s1);
}
if (xeGetAttribute("name") == "mailaddress")
{
xeSetAttribute("connectionString", s2);
}
}
}
nodeList = xmlDocSelectSingleNode("configuration//systemnet//mailSettings//smtp")ChildNodes;
foreach (XmlNode xn in nodeList)
{
//节点类型转换XmlElement类型
XmlElement xe = xn as XmlElement;
if (xeName == "network")
{
xeSetAttribute("host", h);
xeSetAttribute("userName", user);
xeSetAttribute("password", pass);
break;
}
}
xmlDocSave(file);

Modbus是modbus串口设备还是网口设备啊。你都不说清楚, 我都没发给你说。 问问题都这么懒,别人解答的怎么会帮你。modbus是面向工业通信的协议,json是上位机上面向数据存储的协议。核心问题是把数据封装起来,转换为可以作为文件保存的格式。只要把文件格式确定了,WEB或者其它应用都能利用这些数据。现在比较流行的方式,是用多比智能网关转化一下。我前面做了一个MES系统, 就采用的这种方式, 效果还可以, 一共有200多个设备, 10秒采集一次数据, 服务器是8G内存, 4核CPU, 感觉出来任何压力。

JSONstringify之前数据就不对吧,
sendJsonexperimentParam[paramName[i]] = parseFloat(paramValue[i]);应该是
sendJsonexperimentParamparamName[i]= parseFloat(paramValue[i]);
xData也是,存的格式是对象的不能用push


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10872547.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-11
下一篇2023-05-11

发表评论

登录后才能评论

评论列表(0条)

    保存