Обработка Json массив в VB.net - PullRequest
0 голосов
/ 22 января 2020

Я получаю данные от некоторого оборудования для мониторинга, которое возвращает, как мне кажется, массив Json (вложенный), но синтаксис не совсем правильный.

Ниже приведен пример того, что перенастраивается. Это массив UnixTimeMilliseconds и значения.

[[1579617389000,132], [1579617399000,136], [1579617409000,139], [1579617419000,137]]

Это может быть до 3000 наборов этих чисел.

Что я хотел бы сделать, это сбросить их в какой-либо массив, чтобы я мог работать с ним, например, перевести UnixTimeMilliseconds в datetime и выполнить вычисления.

Последнее, что я попробовал, было:

Dim ListResultsArray As Directory()
ListResultsArray = JsonConvert.DeserializeObject(Of Directory())(emoncmsResponse)

, и была возвращена ошибка:

Не удалось создать экземпляр типа System.IO. .directory. Тип является интерфейсом или абстрактным классом и не может быть создан. Путь '[0] .id', строка 1, позиция 7.

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Вы пробовали JObject с помощью NewtonSoft. json .Linq Просто создайте массив JObject и выполните синтаксический анализ Json

 Dim object As JObject()
 JObject.parse(object(index))
0 голосов
/ 22 января 2020

Простой метод преобразования массивов - это анализ JSON с JArray , итерация внутренних массивов и создание нового объекта класса, преобразование значений массива в требуемый тип.

Создайте объект, который может представлять значения массива:

<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 объекта:

Поскольку первое значение в массиве представляет 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 определяется как DateTimeOffset, потому что Unix время выражено в UT C координатах. Вы можете использовать методы DateTimeOffset, чтобы определить локальный DateTime (DateTimeOffset.ToLocalTime) или выполнить другие преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...