首页 > 解决方案 > 在 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。

标签: jsonvb.net

解决方案


转换数组的一个简单方法是使用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) 或执行其他转换。


推荐阅读