json - 在 VB.net 中处理 Json 数组
问题描述
我从一些监控设备获取数据,这些设备返回我认为是 Json(嵌套)数组,但语法不太正确。
以下是正在重新调整的示例。它是一个 UnixTimeMilliseconds 数组和一个值。
[[1579617389000,132],[1579617399000,136],[1579617409000,139],[1579617419000,137]]
这些数字可能多达 3000 组。
我想做的是将它们转储到某种数组的对象中,以便我能够使用它,例如将 UnixTimeMilliseconds 转换为日期时间并进行计算。
我尝试的最后一件事是:
Dim ListResultsArray As Directory()
ListResultsArray = JsonConvert.DeserializeObject(Of Directory())(emoncmsResponse)
并且返回的错误是:
无法创建 System.IO.Directory 类型的实例。类型是接口或抽象类,不能实例化。路径“[0].id”,第 1 行,位置 7。
解决方案
转换数组的一个简单方法是使用JArray解析 JSON ,迭代内部数组并生成一个新的类对象,将数组值转换为所需的类型。
创建一个可以表示数组值的对象:
<JsonArray>
Public Class NumbersItem
Public Sub New(objTime As DateTimeOffset, objValue As Long)
DetectionTime = objTime
Value = objValue
End Sub
Public ReadOnly Property DetectionTime As DateTimeOffset
Public ReadOnly Property Value As Long
End Class
然后解析 JSON 并从每个内部对象生成新的类JArray
对象:
由于 Array 中的第一个值表示以毫秒为单位的 Unix DateTime,因此我们可以使用该DateTimeOffset.FromUnixTimeMilliseconds()
方法对其进行转换。
Dim numbers As New List(Of NumbersItem)()
Dim jsonArrays = JArray.Parse(json)
For Each array As JArray In jsonArrays.Children()
numbers.Add(New NumbersItem(
DateTimeOffset.FromUnixTimeMilliseconds(CType(array.First, Long)),
CType(array.Last, Long)))
Next
现在,您可以NumbersItem
像往常一样检查列表中的每个类对象。
该DetectionTime
属性定义为 a DateTimeOffset
,因为 Unix 时间以 UTC 坐标表示。您可以使用这些DateTimeOffset
方法来确定本地 DateTime ( DateTimeOffset.ToLocalTime
) 或执行其他转换。
推荐阅读
- angular - angular 8 两次加载应用程序资产
- python-3.x - python2和python3的区别
- mysql - MYSQL 从表中选择是否包含给定 IPv6 网络中的 IPv6 网络
- mysql - WordPress 自动化脚本每天同步登台和生产数据库
- c++ - 如何监控ZeroMQ服务器是否存在?
- javascript - 如何在自定义可链接 JavaScript 库中由 querySelectorAll 选择的第一个元素上调用最接近()?
- ckeditor - 如何以相同的 css 样式显示数据库中的 ckeditor 5 内容
- c# - 如何连接字符串中的对象,中间有分号?
- css - 未聚焦时如何更改选定的选项颜色?
- perl - 使用 Net::SFTP::Foreign Perl 模块在屏幕上打印远程服务器 FILENAME、MTIME